Java Hibernate映射子类中的第二个@Embeddeble字段
我试图在一个子类中映射一个@Embeddeble对象,该子类的父类已经有一个@Embeddeble类型的字段 hibernate声称我可以使用@AttributeOverrides覆盖@Embeddeble对象的列名: e、 g 我的情况如下:Java Hibernate映射子类中的第二个@Embeddeble字段,java,database,hibernate,orm,annotations,Java,Database,Hibernate,Orm,Annotations,我试图在一个子类中映射一个@Embeddeble对象,该子类的父类已经有一个@Embeddeble类型的字段 hibernate声称我可以使用@AttributeOverrides覆盖@Embeddeble对象的列名: e、 g 我的情况如下: @Embeddable public class ContentID implements Serializable { @Column(name="contentID") private String cont
@Embeddable
public class ContentID implements Serializable {
@Column(name="contentID")
private String contentPath;
}
@MappedSuperclass
public abstract class BaseDomainObject implements Serializable {
@Embedded
private ContentID contentID;
}
public class Achievement extends BaseDomainObject {
@Embedded
@AttributeOverrides( {
@AttributeOverride(name="contentID", column = @Column(name="awardedItem") ),
} )
private ContentID awardedItem;
}
我得到的错误是:
org.hibernate.MappingException:
实体映射中的重复列:
成就栏:contentID(应该)
使用insert=“false”映射
update=“false”)位于
org.hibernate.mapping.PersistentClass.checkColumnReplication(PersistentClass.java:652)
在
org.hibernate.mapping.PersistentClass.checkPropertyColumnDuplication(PersistentClass.java:674)
在
org.hibernate.mapping.PersistentClass.checkPropertyColumnDuplication(PersistentClass.java:670)
在
org.hibernate.mapping.PersistentClass.checkColumnReplication(PersistentClass.java:696)
在
org.hibernate.mapping.PersistentClass.validate(PersistentClass.java:450)
在
org.hibernate.mapping.SingleTableSubclass.validate(SingleTableSubclass.java:43)
在
org.hibernate.cfg.Configuration.validate(Configuration.java:1108)
在
org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1293)
在
org.hibernate.cfg.AnnotationConfiguration.buildSessionFactory(AnnotationConfiguration.java:867)
更新:
我查找了与此相关的Hibernate问题,GRAILS项目声称他们解决了此问题,但他们的注释解决方案似乎不是有效的javax.persistence注释(可能是新版本)
问题似乎在于:
public class ContentID implements Serializable {
@Column(name="contentID")
private String contentPath;
}
您正在将contentPath列名设置为“contentId”,这与您的AttributeOverride注释稍后发生冲突
试试这个:
public class ContentID implements Serializable {
@Column(name="contentPath")
private String contentPath;
}
更新
我还想知道:
@Embedded
@AttributeOverrides( {
@AttributeOverride(name="contentID", column = @Column(name="awardedItem") ),
} )
private ContentID awardedItem;
您似乎正在将此处contentId列的名称更改为awardedItem。这真的有必要吗?我正在使用
@JoinColumn(insertable=false, updatable=false)
作为解决办法。文森特是对的。
attributeOverride
Name字段在列名应该是类的属性/属性时引用列名
@AttributeOverrides( {
@AttributeOverride(name="contentPath", column = @Column(name="awardedItem") ),
} )
请注意,该名称用于类属性,而不是数据库列
请参见该问题不是由@AttributeOverride在Acquisition中引起的,而是因为@Embedded ContentID位于Acquisition的基类BaseDomainObject中。问题是在hibernate映射中,继承导致对象有两个嵌入的ContentID对象作为ContentID列,我认为AttributeOverride会处理它。即使我删除了@Column(name=“contentID”),我认为问题仍然存在。出于好奇:为什么要嵌入国家而不是使用关系?
@AttributeOverrides( {
@AttributeOverride(name="contentPath", column = @Column(name="awardedItem") ),
} )