2009-06-04 5 views
10

@Embeddableオブジェクトは、その親クラスがすでに@Embeddable型のフィールドを持つサブクラスにマップしようとしています。サブクラスの2番目の@EmbeddableフィールドをHibernateにマッピングする

Iは@Embeddableオブジェクトの列名を上書きする@AttributeOverridesを使用することができEmbeddable Objects documentation請求項休止:

例を

@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"とマップする必要があります update = "false") org.hibernate.mapping.PersistentC lass.checkColumnDuplication org.hibernate.mapping.PersistentClass.checkPropertyColumnDuplication(PersistentClass.java:670)で org.hibernate.mapping.PersistentClass.checkPropertyColumnDuplication(PersistentClass.java:674)で(PersistentClass.java:652) で org.hibernate.mapping.PersistentClass.checkColumnDuplication(PersistentClass.java:696) でorg.hibernate.mapping.PersistentClass.validate(PersistentClass.java:450) でorg.hibernate.mapping.SingleTableSubclass.validate(SingleTableSubclass .java:43) at org.hibernate.cfg.Configuration.validate(Configuration.java:1108) at org.hibernate.cfg.Configuration.buildSessionFactory org.hibernate.cfg.AnnotationConfiguration.buildSessionFactory(AnnotationConfiguration.java:867)で(Configuration.java:1293)

UPDATE:

私はこれに関するHibernateの問題を調べましたが、GRAILSプロジェクトはこの問題を修正したと主張しましたが、アノテーションソリューションは有効なjavax.persistenceアノテーション(新しいバージョンかもしれません)ではないようです。

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

+0

を参照してください:なぜあなたは関係を使用するのではなく、国を埋め込むのですか? –

答えて

7

問題は、このように思わ:

public class ContentID implements Serializable { 
    @Column(name="contentID") 
    private String contentPath; 
} 

あなたは、「コンテンツID」にはcontentPath列名を作っているし、それが後にごAttributeOverride注釈と衝突しています。

これを試してみてください:

public class ContentID implements Serializable { 
    @Column(name="contentPath") 
    private String contentPath; 
} 

UPDATE私もこのことについて疑問に思って

@Embedded 
@AttributeOverrides({ 
    @AttributeOverride(name="contentID", column = @Column(name="awardedItem")), 
}) 
private ContentID awardedItem; 

あなたがawardedItemにここにコンテンツID列の名前を変更しているようです。それは本当に必要ですか?

+0

この問題は、Achievementの@AttributeOverrideに起因するものではなく、AchievementのベースクラスBaseDomainObjectにある@Embedded ContentIDのために発生します。 問題はハイバネートマッピングであり、継承によってオブジェクトに2つの埋め込まれたContentIDオブジェクトがあります。これは、AttributeOverrideが処理すると考えたcontentID列です。 @Column(name = "contentID")を削除しても、問題は残ると思います。 – Dougnukem

1

私は回避策として

@JoinColumn(insertable=false, updatable=false) 

を使用しています。

2

ヴィンセントです。 attributeOverride Nameフィールドは、クラスの属性/プロパティである必要がある場合は列名を参照しています。

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

名前は、データベース列ではなくクラスプロパティの名前であることに注意してください。

は好奇心からdocumentation

関連する問題