我正在尝试在子类中映射一个@Embeddable 对象,该子类的父类已经具有该@Embeddable 类型的字段。
hibernate Embeddable Objects documentation声称我可以使用@AttributeOverrides 来覆盖@Embeddable 对象的列名:
例如
@Entity
public class Person implements Serializable {
// Persistent component using defaults
Address homeAddress;
@Embedded
@AttributeOverrides( {
@AttributeOverride(name="iso2", column = @Column(name="bornIso2") ),
@AttributeOverride(name="name", column = @Column(name="bornCountryName") )
} )
Country bornIn;
...
}
这是我遇到的情况:
@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: Repeated column in mapping for entity: Achievement column: contentID (should be mapped with insert="false" update="false") at org.hibernate.mapping.PersistentClass.checkColumnDuplication(PersistentClass.java:652) at org.hibernate.mapping.PersistentClass.checkPropertyColumnDuplication(PersistentClass.java:674) at org.hibernate.mapping.PersistentClass.checkPropertyColumnDuplication(PersistentClass.java:670) at org.hibernate.mapping.PersistentClass.checkColumnDuplication(PersistentClass.java:696) at org.hibernate.mapping.PersistentClass.validate(PersistentClass.java:450) at org.hibernate.mapping.SingleTableSubclass.validate(SingleTableSubclass.java:43) at org.hibernate.cfg.Configuration.validate(Configuration.java:1108) at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1293) at 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。真的有必要吗?
关于java - Hibernate 在子类中映射第二个@Embeddable 字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/951372/