這篇博文記錄項目實戰開發中遇到的一個bug。
錯誤背景和詳情
問題出現的背景是當數據庫中有一個字段爲longtext 類型,使用JPA 映射時候出現的這個錯誤
/**
* 商品介紹相關URL
*/
@Basic(fetch=LAZY)
@Lob
@Column(name = "goods_introduce",columnDefinition = "longtext")
private String goodsIntroduceUrl;
錯誤提示如下:
Repeated column in mapping for entity: com.xxx.business.goods.bean.GoodsEntity column: goods_introduce (should be mapped with insert="false" update="false")
詳細錯誤信息如下:
Caused by: javax.persistence.PersistenceException: [PersistenceUnit: default] Unable to build Hibernate SessionFactory; nested exception is org.hibernate.MappingException: Repeated column in mapping for entity: com.xxx.business.goods.bean.GoodsEntity column: goods_introduce (should be mapped with insert="false" update="false")
at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.buildNativeEntityManagerFactory(AbstractEntityManagerFactoryBean.java:403)
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:1855)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1792)
... 16 common frames omitted
Caused by: org.hibernate.MappingException: Repeated column in mapping for entity: com.xxx.business.goods.bean.GoodsEntity column: goods_introduce (should be mapped with insert="false" update="false")
at org.hibernate.mapping.PersistentClass.checkColumnDuplication(PersistentClass.java:862)
at org.hibernate.mapping.PersistentClass.checkPropertyColumnDuplication(PersistentClass.java:880)
at org.hibernate.mapping.PersistentClass.checkColumnDuplication(PersistentClass.java:902)
at org.hibernate.mapping.PersistentClass.validate(PersistentClass.java:634)
at org.hibernate.mapping.RootClass.validate(RootClass.java:267)
at org.hibernate.boot.internal.MetadataImpl.validate(MetadataImpl.java:351)
at org.hibernate.boot.internal.SessionFactoryBuilderImpl.build(SessionFactoryBuilderImpl.java:464)
at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:1249)
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)
... 20 common frames omitted
解決方案
問題在於數據庫中自定義了一個longtext
類型字段,然後Spring Data JPA 自定義了一種類型,造成字段重複。
解決思路也很簡單,就是針對該字段禁用Spring Data JPA 的插入表字段和更新表字段的功能。
/**
* 商品介紹相關URL
*/
@Basic(fetch=LAZY)
@Lob
@Column(name = "goods_introduce",columnDefinition = "longtext",insertable = false,updatable = false)
private String goodsIntroduceUrl;