異常org.hibernate.DuplicateMappingException:Table [xx] contains physical column name [xx]

問題描述:

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的屬性爲準。

暫時只找到這些辦法,如果你有好的方法,歡迎留言。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章