java - Hibernate 在子类中映射第二个@Embeddable 字段

标签 java database hibernate orm annotations

我正在尝试在子类中映射一个@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 注释(可能是新版本)。

JPA @Embeddable/@Embedded throws org.hibernate.MappingException: Repeated column in mapping for entity

最佳答案

问题似乎是这样的:

 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/

相关文章:

java String - 字符串索引超出范围,charAt

java - 2个节点之间的最长路径

database - 将表和索引从一个 SQL Server 2000 数据库导出到另一个数据库

java - 如何使用 @ID 和 @GenerateValue 从 Hibernate + JPA 中的序列获取 Oracle 生成值

hibernate - @Query : function ll_to_earth(double precision, double )不存在

java - 如何在 MySQL 数据源中设置 jdbc ClientInfo

mysql - 当外键指向其他内容时,也移动其他数据

MongoDB:如何将两个集合/数据库合并为一个?

java - 使用什么级联类型来仅保存多对多映射的子级列表?

java - 如何在 hybris 中进行不区分大小写的用户名身份验证?