Java Hibernate映射子类中的第二个@Embeddeble字段

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

我试图在一个子类中映射一个@Embeddeble对象,该子类的父类已经有一个@Embeddeble类型的字段

hibernate声称我可以使用@AttributeOverrides覆盖@Embeddeble对象的列名:

e、 g

我的情况如下:

 @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") ),
} )