2009-06-04 46 views
10

我試圖在子類中映射一個@Embeddable對象,該類的父類中已有一個@Embeddable類型的字段。Hibernate映射子類中的第二個@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」 update =「false」)at org.hibernate.mapping.PersistentC lass.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) at org.hibernate.cfg.Configuration.validate(Configuration.java:1108) at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1293) 在 org.hibernate.cfg.AnnotationConfiguration.buildSessionFactory(AnnotationConfiguration.java:867)

UPDATE:

我查找了與此有關的Hibernate問題,GRAILS項目聲稱他們解決了這個問題,但他們的註解解決方案似乎不是有效的javax.persistence註釋(也許它是一個新版本)。

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

+0

出於好奇:爲什麼你嵌入國家,而不是使用的關係呢? – 2013-12-28 21:05:10

回答

7

這個問題似乎是這樣的:

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

你在進行的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。這真的有必要嗎?

+0

此問題不是由Achievement中的@AttributeOverride引起的,而是由於Achievement的基類BaseDomainObject中的@Embedded ContentID造成的。 問題在於hibernate映射的繼承導致對象有2個Embedded ContentID對象作爲contentID列,我認爲AttributeOverride會照顧它。 即使我刪除@Column(name =「contentID」),我認爲問題仍然存在。 – Dougnukem 2009-06-04 16:43:34

1

我使用

@JoinColumn(insertable=false, updatable=false) 

作爲一種解決方法。

2

文森特是正確的。 attributeOverride名稱字段在應該是類的屬性/屬性時引用列名稱。

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

請注意,該名稱是針對類屬性而不是數據庫列。

documentation

相關問題