Spring引用JPA在TABLE中插入大写名称和Hibernate

我有一个表实体映射为:

@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中)

我在我的application.properties文件中:

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

在hibernate5,它会

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

在您的application.properties文件中。

它添加的解决方案:

spring.jpa.hibernate.naming_strategy = org.hibernate.cfg.EJB3NamingStrategy

到application.properties 🙂

是啊!

您需要使用tics(`)转义表名以使其区分大小写。

 @Table(name = "`ITEMS_TO_REGISTER`") 

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

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

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

但请记住 – 在实体类中使用没有@Table,@ Column注释的PhysicalNamingStrategy时,hibernate使用类名和变量名生成SQL。 考虑下面的java类

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

然后生成的sql将是,

 select employee0_.firstName,employee0_lastName from Employee employee0_; 

不幸的是,这不是一个很好的选择,因为通常我们会将数据库中的列定义为FIRST_NAME和LAST_NAME,将表名定义为EMPLOYEE。 如果你没有使用过PhysicalNamingStrategy那么SQL本来就是

 select employee0_.first_name,employee0_last_name from employee employee0_; 

所以它真的是以下两个选项之间的选择。

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

你可以试试:

 @Entity @Table(name = "ITEMS_TO_REGISTER") public class ItemsToRegister implements Serializable { ... 

您可以实现自己的策略并从application.properties调用它:

 spring.jpa.hibernate.naming.physical-strategy=com.proto.CustomPhysicalNamingStrategy 

贝娄一个总是把第一个字母大写的例子

 import java.io.Serializable; import org.apache.commons.lang3.StringUtils; import org.hibernate.boot.model.naming.Identifier; import org.hibernate.boot.model.naming.PhysicalNamingStrategy; import org.hibernate.engine.jdbc.env.spi.JdbcEnvironment; public class CustomPhysicalNamingStrategy implements PhysicalNamingStrategy, Serializable { /** * Singleton access */ public static final CustomPhysicalNamingStrategy INSTANCE = new CustomPhysicalNamingStrategy(); @Override public Identifier toPhysicalCatalogName(Identifier name, JdbcEnvironment context) { return capitalize(name); } @Override public Identifier toPhysicalSchemaName(Identifier name, JdbcEnvironment context) { return capitalize(name); } @Override public Identifier toPhysicalTableName(Identifier name, JdbcEnvironment context) { return capitalize(name); } @Override public Identifier toPhysicalSequenceName(Identifier name, JdbcEnvironment context) { return capitalize(name); } @Override public Identifier toPhysicalColumnName(Identifier name, JdbcEnvironment context) { return capitalize(name); } private Identifier capitalize(Identifier name) { if (name == null) return null; if (name.isQuoted()) return name; String text = StringUtils.capitalize(name.getText()); return Identifier.toIdentifier(text); } }