问题描述:

Caused by: org.hibernate.DuplicateMappingException: Table [postrolerelation] contains logical column name [SORTVALUE] referring to multiple physical column names: [sort_value], [sortvalue]
错误信息翻译:表[postrolerelation]包含逻辑列名[SORTVALUE],指多个物理列名:[sort_value], [SORTVALUE]。
项目描述:SpringBoot+H2写单元测试,postrolerelation表中以id和sortValue作为联合主键。

 

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactory' defined in class path resource [org/springframework/boot/autoconfigure/orm/jpa/HibernateJpaConfiguration.class]: Invocation of init method failed; nested exception is org.hibernate.DuplicateMappingException: Table [postrolerelation] contains logical column name [SORTVALUE] referring to multiple physical column names: [sort_value], [sortvalue]
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1778) ~[spring-beans-5.1.7.RELEASE.jar:5.1.7.RELEASE]
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:593) ~[spring-beans-5.1.7.RELEASE.jar:5.1.7.RELEASE]
	at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:549) ~[spring-context-5.1.7.RELEASE.jar:5.1.7.RELEASE]
	at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:775) [spring-boot-2.1.5.RELEASE.jar:2.1.5.RELEASE]
	at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:397) [spring-boot-2.1.5.RELEASE.jar:2.1.5.RELEASE]
	at org.springframework.boot.SpringApplication.run(SpringApplication.java:316) [spring-boot-2.1.5.RELEASE.jar:2.1.5.RELEASE]
	at org.springframework.boot.SpringApplication.run(SpringApplication.java:1260) [spring-boot-2.1.5.RELEASE.jar:2.1.5.RELEASE]
	at org.springframework.boot.SpringApplication.run(SpringApplication.java:1248) [spring-boot-2.1.5.RELEASE.jar:2.1.5.RELEASE]
	at dev.csi.organ.OrganInfoApplication.main(OrganInfoApplication.java:24) [test-classes/:na]
Caused by: org.hibernate.DuplicateMappingException: Table [postrolerelation] contains logical column name [SORTVALUE] referring to multiple physical column names: [sort_value], [sortvalue]
	at org.hibernate.boot.internal.InFlightMetadataCollectorImpl$TableColumnNameBinding.bindLogicalToPhysical(InFlightMetadataCollectorImpl.java:923) ~[hibernate-core-5.3.10.Final.jar:5.3.10.Final]
	at org.hibernate.boot.internal.InFlightMetadataCollectorImpl$TableColumnNameBinding.addBinding(InFlightMetadataCollectorImpl.java:911) ~[hibernate-core-5.3.10.Final.jar:5.3.10.Final]
	at org.hibernate.boot.internal.InFlightMetadataCollectorImpl.addColumnNameBinding(InFlightMetadataCollectorImpl.java:982) ~[hibernate-core-5.3.10.Final.jar:5.3.10.Final]
	at org.hibernate.boot.internal.InFlightMetadataCollectorImpl.addColumnNameBinding(InFlightMetadataCollectorImpl.java:963) ~[hibernate-core-5.3.10.Final.jar:5.3.10.Final]
	at org.hibernate.cfg.Ejb3Column.addColumnBinding(Ejb3Column.java:409) ~[hibernate-core-5.3.10.Final.jar:5.3.10.Final]

 

原因分析:

应用Spring Data JPA 自定创建数据表时,设置的字段命名策略为 `SpringPhysicalNamingStrategy`

jpa:
   hibernate:
   	   naming:
   	   	   physical-strategy: org.springframework.boot.orm.jpa.hibernate.SpringPhysicalNamingStrategy

这个命名策略:当字段为小写,当有大写字母的时候会转换为分隔符号“_”,所以sortValue就会自动创建一个sort_value的字段属性,如果我们制定@Column时,还给它指定sort_value它就会认为我们给该实体类属性指定了多个数据表字段。

解决方案:修改命名策略

jpa:
    hibernate:
        naming:
            physical-strategy: org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl

PhysicalNamingStrategyStandardImpl 直接映射,不做过多的处理,但存在@Table与@Column注解时,以设置的@Table,@Column的属性为准。

 

原文链接:https://blog.csdn.net/Monarchess_1234/article/details/112675485

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐