【问题标题】:Hibernate renames some columns at start with Spring Boot 1.4从 Spring Boot 1.4 开始,Hibernate 重命名了一些列
【发布时间】:2018-10-21 15:18:30
【问题描述】:

我在某些表上的 PostgreSQL 数据库列存在一些问题。

如果我声明一个名为 String 的列,名称类似于 a_column_name Hibernate 接受名称为 a_column_name 的表列。

但是当我将列类型声明为IntegerBigDecimal 时,我的问题就来了。一开始,Hibernate 会创建一个类型为 int4numeric(19, 2) 的新列,其名称类似于 acolumnname 和 NULL。

Hibernate: alter table t_myTable add column acolumnname int4

Hibernate: alter table t_myTable add column 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 类型的列名,但不喜欢 IntegerBigDecimal 类型的列名.

问候。

---- 更新 1 ----

按照 Veselin Davidov 的要求搜索实体并在此处发布代码后,我注意到有些列被接受,而另一些则不被接受。

实体是从公司框架创建的,该框架使用 DB 结构(表、字段、字段类型...)解析 JSON 并生成 JAVA 实体类。因此,在看到 SAM 的答案后,我更改了实体模板的代码以添加@Column(name = "your_column_name")。现在,当 Hibernate 启动时,它不会添加名称错误的列并使用 DB 列。

【问题讨论】:

  • 你能告诉我们你的实体吗?为什么不在实体类中添加列名?
  • 您好,抱歉耽搁了,我试图找出问题所在,但我做到了。由于 SAM 的回答,我已经更新了描述以及我如何解决问题。无论如何感谢您的时间和帮助!

标签: java postgresql hibernate spring-boot


【解决方案1】:

如果你的 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 类型,那么它会将您的表更新为 int4allow nullBigDecimal 也与 numeric(10,2)allow null 相同。为了避免在数据库中使用allow null,请使用基本类型intdouble

【讨论】:

  • 您好,感谢您的回答。您的解决方案启发了我了解问题所在。谢谢!
  • 编码愉快!!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-31
  • 2020-06-06
  • 1970-01-01
  • 2021-05-04
  • 1970-01-01
相关资源
最近更新 更多