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); } }
- 使用Spring和Hibernate的嵌套事务
- HibernateException:连接太多,使用c3p0
- 在Hibernate中使用HQL在一个表中插入数据
- 让Hibernate和SQL Server与VARCHAR和NVARCHAR一起玩得很好
- org.hibernate.hql.internal.ast.QuerySyntaxException:意外令牌:*靠近第1行
- javagenerics类型参数和对这些类型的操作
- Hibernate – Custom Dialect的BigDecimal列映射
- JPA 2.1 Hibernate中的NamedSubgraph忽略嵌套子图
- Hibernate ConfigurationException:找不到cfg.xml资源 IntelliJ