問題描述:
Caused by: org.hibernate.DuplicateMappingException: Table [jst_order] contains physical column name [is_cod] referred to by multiple logical column names: [is_Cod], [isCod]
錯誤信息翻譯:重複映射異常,is_cod字段在表 jst_order中對應了is_Cod與isCod多個字段。
項目描述:SpringBoot+Hibernate項目中:實體類中屬性上加入@Colunm註解,並指定註解的name爲對應表字段時,報該錯誤。當將@Colunm註解去除或是在name屬性中填入當前實體類名稱,則不報錯。
詳細錯誤信息如下:
Caused by: org.hibernate.DuplicateMappingException: Table [jst_order] contains physical column name [is_cod] referred to by multiple logical column names: [is_Cod], [isCod]
at org.hibernate.boot.internal.InFlightMetadataCollectorImpl$TableColumnNameBinding.bindPhysicalToLogical(InFlightMetadataCollectorImpl.java:931)
at org.hibernate.boot.internal.InFlightMetadataCollectorImpl$TableColumnNameBinding.addBinding(InFlightMetadataCollectorImpl.java:900)
at org.hibernate.boot.internal.InFlightMetadataCollectorImpl.addColumnNameBinding(InFlightMetadataCollectorImpl.java:970)
at org.hibernate.boot.internal.InFlightMetadataCollectorImpl.addColumnNameBinding(InFlightMetadataCollectorImpl.java:951)
at org.hibernate.cfg.Ejb3Column.addColumnBinding(Ejb3Column.java:409)
at org.hibernate.cfg.Ejb3Column.linkWithValue(Ejb3Column.java:371)
at org.hibernate.cfg.annotations.SimpleValueBinder.linkWithValue(SimpleValueBinder.java:450)
at org.hibernate.cfg.annotations.SimpleValueBinder.make(SimpleValueBinder.java:426)
at org.hibernate.cfg.annotations.PropertyBinder.makePropertyAndValue(PropertyBinder.java:193)
at org.hibernate.cfg.annotations.PropertyBinder.makePropertyValueAndBind(PropertyBinder.java:205)
at org.hibernate.cfg.AnnotationBinder.processElementAnnotations(AnnotationBinder.java:2282)
at org.hibernate.cfg.AnnotationBinder.processIdPropertiesIfNotAlready(AnnotationBinder.java:975)
at org.hibernate.cfg.AnnotationBinder.bindClass(AnnotationBinder.java:802)
at org.hibernate.boot.model.source.internal.annotations.AnnotationMetadataSourceProcessorImpl.processEntityHierarchies(AnnotationMetadataSourceProcessorImpl.java:254)
at org.hibernate.boot.model.process.spi.MetadataBuildingProcess$1.processEntityHierarchies(MetadataBuildingProcess.java:230)
at org.hibernate.boot.model.process.spi.MetadataBuildingProcess.complete(MetadataBuildingProcess.java:273)
at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.metadata(EntityManagerFactoryBuilderImpl.java:1214)
at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:1245)
at org.springframework.orm.jpa.vendor.SpringHibernateJpaPersistenceProvider.createContainerEntityManagerFactory(SpringHibernateJpaPersistenceProvider.java:58)
at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.createNativeEntityManagerFactory(LocalContainerEntityManagerFactoryBean.java:365)
at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.buildNativeEntityManagerFactory(AbstractEntityManagerFactoryBean.java:391)
at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.afterPropertiesSet(AbstractEntityManagerFactoryBean.java:378)
at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.afterPropertiesSet(LocalContainerEntityManagerFactoryBean.java:341)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1862)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1799)
... 16 common frames omitted
原因分析:
應用Spring Data JPA 自定創建數據表時,設置的字段命名策略爲 `SpringPhysicalNamingStrategy`jpa:
hibernate:
naming:
physical-strategy: org.springframework.boot.orm.jpa.hibernate.SpringPhysicalNamingStrategy
這個命名策略:當字段爲小寫,當有大寫字母的時候會轉換爲分隔符號“_”,所以isCod就會自動創建一個is_cod的字段屬性,如果我們制定@Column時,還給它指定is_cod它就會認爲我們給該實體類屬性指定了多個數據表字段。
解決方案:
方案一:去掉@Column註解
方案二:修改命名策略
jpa:
hibernate:
naming:
physical-strategy: org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl
PhysicalNamingStrategyStandardImpl 直接映射,不做過多的處理,但存在@Table與@Column註解時,以設置的@Table,@Column的屬性爲準。
暫時只找到這些辦法,如果你有好的方法,歡迎留言。