Spring Boot + JPA:忽略字段名称注解。

26 浏览
0 Comments

Spring Boot + JPA:忽略字段名称注解。

我有一个基于Spring Boot的应用程序,使用的依赖是spring-boot-starter-data-jpa。我的实体类有一个带有列名注解的@Column属性。例如:

@Column(name="TestName")
private String testName;

由此产生的SQL会将test_name作为列名。在寻找解决方案时,我发现spring.jpa.hibernate.naming_strategy=org.hibernate.cfg.EJB3NamingStrategy可以解决此问题(从列注释中获取列名)。

但是,我的问题是,如果没有设置EJB3NamingStrategy命名策略,为什么JPA会忽略列注释?也许Hibernate方言(dialect)与此有关?我连接到MS SQL 2014 Express,我的日志包含:

Unknown Microsoft SQL Server major version [12] using SQL Server 2000 dialect
Using dialect: org.hibernate.dialect.SQLServerDialect 

admin 更改状态以发布 2023年5月22日
0
0 Comments

默认情况下,Spring使用 org.springframework.boot.orm.jpa.SpringNamingStrategy 来生成表名。这是对 org.hibernate.cfg.ImprovedNamingStrategy 的极度轻微的扩展。在该类中的tableName方法接收源 String 值,但它不知道它来自 @Column.name 属性还是隐式从字段名生成的。

ImprovedNamingStrategyCamelCase 转换为 SNAKE_CASE,而 EJB3NamingStrategy 仅使用未更改的表名。

如果您不想更改命名策略,您始终可以只在小写中指定列名:

@Column(name="testname")

0
0 Comments

对于Hibernate 5,我通过在我的application.properties文件中添加以下行来解决这个问题:

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

0