【问题标题】:Hibernate mapping a second @Embeddable field in a subclassHibernate 在子类中映射第二个 @Embeddable 字段
【发布时间】:2010-10-31 09:13:25
【问题描述】:

我正在尝试将@Embeddable 对象映射到其父类已经具有该@Embeddable 类型的字段的子类中。

休眠的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: 实体映射中的重复列: 成就栏:contentID(应该 用 insert="false" 映射 更新=“假”)在 org.hibernate.mapping.PersistentClass.checkColumnDuplication(PersistentClass.java:652) 在 org.hibernate.mapping.PersistentClass.checkPropertyColumnDuplication(PersistentClass.java:674) 在 org.hibernate.mapping.PersistentClass.checkPropertyColumnDuplication(PersistentClass.java:670) 在 org.hibernate.mapping.PersistentClass.checkColumnDuplication(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 注释(可能是新版本)。

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

【问题讨论】:

  • 出于好奇:为什么要嵌入国家而不是使用关系?

标签: java database hibernate orm annotations


【解决方案1】:

文森特是对的。 attributeOverride Name 字段在它应该是类的属性/属性时引用列名。

@AttributeOverrides( {
    @AttributeOverride(name="contentPath", column = @Column(name="awardedItem") ),
} )

请注意,该名称用于类属性而不是数据库列。

documentation

【讨论】:

    【解决方案2】:

    我正在使用

    @JoinColumn(insertable=false, updatable=false)
    

    作为一种解决方法。

    【讨论】:

      【解决方案3】:

      问题似乎是这样的:

       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 列的名称更改为awardItem。真的有必要吗?

      【讨论】:

      • 这个问题不是由Achievement 中的@AttributeOverride 引起的,而是因为Achievement 的基类BaseDomainObject 中的@Embedded ContentID。问题是在休眠映射中,继承导致对象有 2 个嵌入式 ContentID 对象作为 contentID 列,我认为 AttributeOverride 会处理它。即使我删除了 @Column(name="contentID") 我认为问题仍然存在。
      猜你喜欢
      • 2015-05-30
      • 1970-01-01
      • 2012-04-22
      • 2020-05-06
      • 2015-07-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多