我的 PostgreSQL 数据库列在某些表上遇到一些问题。
如果我声明一个名为 a_column_name
的 String
列,Hibernate 接受名为 a_column_name 的表列
.
但是当我将列类型声明为 Integer
或 BigDecimal
时,我的问题就出现了。开始时,Hibernate 创建一个 int4
或 numeric(19, 2)
类型的新列,其名称类似于 acolumnname 带有 NULL。
Hibernate:更改表 t_myTable 添加列 acolumnname int4
或
Hibernate:更改表 t_myTable 添加列 acolumnname numeric(19, 2)
我尝试设置 name-strategy on the config file of Spring boot :
jpa:
show-sql: true
hibernate:
ddl-auto: update
properties:
hibernate.cache.use_second_level_cache: false
hibernate.cache.use_query_cache: false
hibernate.generate_statistics: true
naming.physical-strategy: PhysicalNamingStrategyStandardImpl
但是没有结果...
所以我的问题是为什么 Hibernate 接受 String 类型的列名,但不喜欢 Integer 或 BigDecimal 类型的列名.
问候。
---- 更新 1 ----
按照 Veselin Davidov 的要求搜索实体并在此处发布代码后,我注意到有些列被接受,而另一些则不被接受。
实体是从公司框架创建的,该框架使用数据库结构(表、字段、字段类型...)解析 JSON 并生成 JAVA 实体类。因此,在看到 SAM 的答案后,我更改了实体模板的代码以添加 @Column(name = "your_column_name")
。现在,当 Hibernate 启动时,它不会添加名称错误的列并使用 DB 列。
最佳答案
如果您的 Hibernate 实体类如下所示:
@Entity
public class Registration{
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private int id;
@Column
@Basic
private String name;
// getters and setters
}
那么您的注册表将包含以“id”和“name”命名的字段,就像您使用的auto-ddl=update
一样。为了避免这种情况,您可以使用 @Column(name = "your_column_name")
指定列名称,如下所示:
@Table(name = "registration")
@Entity
public class Registration{
@Id
@Column(name = "r_id")
@GeneratedValue(strategy = GenerationType.AUTO)
private int id;
@Basic
@Column(name = "r_name")
private String name;
// getters and setters
}
如果您使用Intellij IDEA
,那么 IDE 可以生成所需的实体类。
您可以转到持久性选项卡 -> 右键单击项目名称 -> 生成持久性映射 -> 按数据库架构。然后选择要生成其实体的表。瞧,一切都很轻松。
现在来解决您的问题,在您的实体类中,如果您设置一些具有 Integer
类型的字段,那么它会将您的表更新为 int4
并使用 allow null
。 BigDecimal
也与 numeric(10,2)
和 allow null
相同。要避免数据库中允许 null
,请使用原始类型 int
和 double
。
关于java - Hibernate 在 Spring Boot 1.4 开始时重命名了一些列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50288373/