Spring boot JPA insert in TABLE 中,大写名称与休眠

2022-08-31 15:15:34

我有一个表实体映射为:

@Entity
public class ItemsToRegister implements Serializable{

@Id
@Column(name = "ID_ITEM_TO_REGISTER")
@GeneratedValue(strategy = GenerationType.AUTO)
private int id;
.....

当我尝试在数据库中插入新记录时,表名被小写翻译为: items_to_register ,但我的表名ITEMS_TO_REGISTER如何在不更改MySql配置的情况下解决我的问题?(my.cnf)

我在我的应用程序.属性文件中:

spring.jpa.hibernate.dialect = org.hibernate.dialect.MySQL5Dialect
spring.jpa.hibernate.naming_strategy = org.hibernate.cfg.ImprovedNamingStrategy

答案 1

在休眠 5 上,它将是

spring.jpa.hibernate.naming.physical-strategy=org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl

application.properties 文件中。


答案 2

正如@jasonleakey建议的那样,我们可以考虑使用如下命名策略。

spring.jpa.hibernate.naming.physical-strategy=org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl

这告诉Hibernate生成SQL,就像在@Table(name=“ ”)或@Column(name=“)中指定的一样。都很好。

但请记住 - 在不使用@Table的情况下使用物理命名策略时,@Column实体类中的注释,休眠使用类名和变量名生成SQL。考虑下面的 java 类

Class Employee {
   private String firstName;
   private String lastName; 
}

那么生成的 sql 将是,

select employee0_.firstName,employee0_lastName from Employee employee0_;

不幸的是,这不是一个好的选择,因为通常我们会将DB中的列定义为FIRST_NAME,并将LAST_NAME和表名定义为 EMPLOYEE。如果你没有使用物理命名策略,SQL就会是

select employee0_.first_name,employee0_last_name from employee employee0_;

因此,这实际上是在以下两个选项之间进行选择。

  • 使用 PhysicalStrategy 并在 java 代码中显式定义所有表名/列名,并带有@Table和@Column注释。
  • 在 db 中定义小写的表名,让休眠自动为我们生成表名/列名。

推荐