Spring Boot + JPA:忽略列名称注释
我有一个Spring引导应用程序依赖“spring-boot-starter-data-jpa”。 我的实体类具有列名称的列注释。 例如:
@Column(name="TestName") private String testName;
由此创build的test_name作为列名生成的SQL。 find解决scheme后,我发现spring.jpa.hibernate.naming_strategy=org.hibernate.cfg.EJB3NamingStrategy
解决了问题(列名取自列注释)。
不过,我的问题是,为什么没有将naming_strategy设置为EJB3NamingStrategy
JPA忽略了列注释? 也许冬眠方言有什么关系呢? 我正在连接到MS SQL 2014 Express,我的日志包含:
Unknown Microsoft SQL Server major version [12] using SQL Server 2000 dialect Using dialect: org.hibernate.dialect.SQLServerDialect
默认情况下,Spring使用org.springframework.boot.orm.jpa.SpringNamingStrategy
来生成表名。 这是org.hibernate.cfg.ImprovedNamingStrategy
一个非常简单的扩展。 该类中的tableName
方法传递一个源String
值,但它不知道它是来自@Column.name
属性,还是已经从字段名称隐式生成。
ImprovedNamingStrategy
将CamelCase
转换为SNAKE_CASE
,因为EJB3NamingStrategy
只是使用表名不变。
如果您不想更改命名策略,则可以始终使用小写字母指定列名称:
@Column(name="testname")
对于hibernate5我解决了这个问题,把下一行放在我的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
看起来
@Column(名称= “..”)
除非有,否则完全被忽视
spring.jpa.hibernate.naming_strategy = org.hibernate.cfg.EJB3NamingStrategy
指定,所以对我来说这是一个错误。
我花了几个小时试图弄清楚为什么@Column(name =“..”)被忽略。
对我来说唯一的解决scheme就是上面teteArg发布的解决scheme。 我在春季启动1.4.2 W / Hibernate的5.也就是说
spring.jpa.hibernate.naming.implicit-strategy=org.hibernate.boot.model.naming.ImplicitNamingStrategyLegacyJpaImpl spring.jpa.hibernate.naming.physical-strategy=org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl
为了更深入的了解,我发布了调用跟踪,以便清楚地说明Spring是如何调用Hibernate来设置命名策略的。
at org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl.toPhysicalColumnName(PhysicalNamingStrategyStandardImpl.java:46) at org.hibernate.cfg.Ejb3Column.redefineColumnName(Ejb3Column.java:309) at org.hibernate.cfg.Ejb3Column.initMappingColumn(Ejb3Column.java:234) at org.hibernate.cfg.Ejb3Column.bind(Ejb3Column.java:206) at org.hibernate.cfg.Ejb3DiscriminatorColumn.buildDiscriminatorColumn(Ejb3DiscriminatorColumn.java:82) at org.hibernate.cfg.AnnotationBinder.processSingleTableDiscriminatorProperties(AnnotationBinder.java:797) at org.hibernate.cfg.AnnotationBinder.bindClass(AnnotationBinder.java:561) at org.hibernate.boot.model.source.internal.annotations.AnnotationMetadataSourceProcessorImpl.processEntityHierarchies(AnnotationMetadataSourceProcessorImpl.java:245) at org.hibernate.boot.model.process.spi.MetadataBuildingProcess$1.processEntityHierarchies(MetadataBuildingProcess.java:222) at org.hibernate.boot.model.process.spi.MetadataBuildingProcess.complete(MetadataBuildingProcess.java:265) at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.metadata(EntityManagerFactoryBuilderImpl.java:847) at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:874) at org.springframework.orm.jpa.vendor.SpringHibernateJpaPersistenceProvider.createContainerEntityManagerFactory(SpringHibernateJpaPersistenceProvider.java:60) at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.createNativeEntityManagerFactory(LocalContainerEntityManagerFactoryBean.java:353) at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.buildNativeEntityManagerFactory(AbstractEntityManagerFactoryBean.java:373) at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.afterPropertiesSet(AbstractEntityManagerFactoryBean.java:362) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1642) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1579) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:553) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:482) at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:306) at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230) - locked <0x1687> (a java.util.concurrent.ConcurrentHashMap) at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:302) at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:197) at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:1081) at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:856) at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:542) - locked <0x1688> (a java.lang.Object) at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:761) at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:371) at org.springframework.boot.SpringApplication.run(SpringApplication.java:315) at org.springframework.boot.SpringApplication.run(SpringApplication.java:1186) at org.springframework.boot.SpringApplication.run(SpringApplication.java:1175)
太好了 ,非常感谢。 只是一个附加的信息,每个人碰到这个问题将能够理解为什么。
在Spring Boot通用属性中指出了teteArg所说的内容: http : //docs.spring.io/spring-boot/docs/current/reference/html/common-application-properties.html
显然, spring.jpa.hibernate.naming.strategy不是使用Hibernate 5的Spring JPA实现支持的属性。
唯一对我有用的是在上面贴出了两行代码:
spring.jpa.hibernate.naming.implicit-strategy=org.hibernate.boot.model.naming.ImplicitNamingStrategyLegacyJpaImpl spring.jpa.hibernate.naming.physical-strategy=org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl
只有ncaralicea提出的单行不适合我
@Column(name="TestName")
的默认策略将是test_name
,这是正确的行为!
如果在数据库中有一个名为TestName
的列,则应将Column注释更改为@Column(name="testname")
。
这是有效的,因为数据库不关心,如果你命名你的列TestName或testing名称 ( 列名不区分大小写!! )。
但是要注意,数据库名和表名也是如此,在Unix系统上区分大小写,而在Windows系统上则区分大小写(事实上可能让很多人在晚上醒来,在windows上工作,但是在linux上部署:))
- hibernate – @ElementCollection – 奇怪的删除/插入行为
- ORDER BY使用Criteria API
- hibernate中JOIN和JOIN FETCH的区别
- 设置SQL Server的Maven依赖关系
- 查询指定的联接抓取,但抓取的关联的所有者不在select列表中
- javax.persistence.Table.indexes()中的NoSuchMethodError [Ljavax / persistence / Index
- 在(…)查询中编写HQL的正确方法
- Java是否有使用声明?
- 错误:java.lang.NoSuchMethodError:org.objectweb.asm.ClassWriter。<init>(I)V