19

我有表HolidayPackageVariant其中IDHOLIDAYPACKAGE是指實體HolidayPackageHolidayPackageVariantHolidayPackage之間的許多一個關係的複合主鍵(IDHOLIDAYPACKAGE, IDHOLIDAYPACKAGEVARIANT)爲什麼我的EmbeddedId在休眠模式下不工作?

當我嘗試做HolidayPackageVariant的複方PK地圖,我得到以下錯誤:

Initial SessionFactory creation failed.org.hibernate.annotations.common.AssertionFailure: Declaring class is not found in the inheritance state hierarchy: org.wah.model.holidaypackage.HolidayPackageVariantPrimaryKey

有人能告訴我什麼我做錯了嗎?

我的POJO是這樣的:

HolidayPackageVariant:

@Entity 
@Table(name="HOLIDAYPACKAGEVARIANT") 
public final class HolidayPackageVariant { 

    private HolidayPackageVariantPrimaryKey idCompound; 

    @EmbeddedId 
    public HolidayPackageVariantPrimaryKey getIdCompound() { 
     return idCompound; 
    } 

    // other code 
} 

HolidayPackageVariantPrimaryKey

@Embeddable 
public final class HolidayPackageVariantPrimaryKey implements Serializable { 

    private Integer idHolidayPackageVariant; 
    private HolidayPackage holidayPackage; 

    public HolidayPackageVariantPrimaryKey(){} 

    public HolidayPackageVariantPrimaryKey(int id, HolidayPackage pkg){ 
     setIdHolidayPackageVariant(id); 
     setHolidayPackage(pkg); 
    } 

    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    @Column(name = "IDHOLIDAYPACKAGEVARIANT", nullable = false) 
    public Integer getIdHolidayPackageVariant() { 
     return idHolidayPackageVariant; 
    } 

    @Id 
    @ManyToOne(fetch=FetchType.LAZY, cascade={CascadeType.ALL}) 
    @JoinColumn(name="IDHOLIDAYPACKAGE", nullable=false) 
    public HolidayPackage getHolidayPackage() { 
     return holidayPackage; 
    } 

    // equals and hashCode 
} 

HolidayPackage

public final class HolidayPackage { 
    private Set<HolidayPackageVariant> holidayPackageVariants = new HashSet<HolidayPackageVariant>(0); 

    @OneToMany(fetch=FetchType.LAZY, cascade={CascadeType.ALL}, mappedBy = "idCompound.holidayPackage") 
    public Set<HolidayPackageVariant> getHolidayPackageVariants() { 
     return holidayPackageVariants; 
    } 

    // other code 
} 
+0

Hi @brainydexter,你能否改變這個問題的正確答案?我不得不修復它然後回到這裏併發布答案,只是意識到它已經在那裏。 – coderatchet 2017-06-30 04:10:24

+1

@coderatchet完成。感謝您指出。沒有做休眠的東西了,所以這下跌了我的雷達。 – brainydexter 2017-07-06 17:55:39

回答

77

EmbeddedId類中不應該有@Id。在HolidayPackageVariantPrimaryKey中刪除Id註釋,它應該可以正常工作。

+4

這也解決了我的問題。我認爲這應該被標記爲答案而不是之前的答案。 – Jalpesh 2013-01-05 06:55:24

+2

似乎這是正確的答案 – 2014-01-01 15:29:27

+0

但是,我會做什麼,例如如果我想在我的'@ Embedded'中想要一個'private Long id'成員來每次插入一個元素時都得到一個自動值?這是[我只是沒有得到](http://stackoverflow.com/questions/29976363/hibernate-generatedvalue-in-embedded-always-null)... – displayname 2015-05-01 11:39:09

2

我已經轉戰@EmbeddedId一次,我已經完成了實現相同的目標與@IdClass。不同的是,當你使用@IdClass時,你不會在類定義中使用它,但是你重新聲明瞭相同的字段(然而,我已經指定了id字段的getters/setter,這對我來說更舒服)。

這裏是我的榜樣,從項目,我用它來從波蘭政府機構GUS處理免費提供的地址數據庫:

組合鍵:

@Embeddable 
class GusPowiatPK implements Serializable { 
    private static final long serialVersionUID = 1L; 
    private Short powiatNr; 
    private GusWojewodztwo wojewodztwo; 

    @Column(name = "POW_NR") 
    public Short getPowiatNr() { 
     return powiatNr; 
    } 

    public void setPowiatNr(Short powiatNr) { 
     this.powiatNr = powiatNr; 
    } 

    @ManyToOne 
    @JoinColumn(name = "WOJ_ID") 
    public GusWojewodztwo getWojewodztwo() { 
     return wojewodztwo; 
    } 

    public void setWojewodztwo(GusWojewodztwo wojewodztwo) { 
     this.wojewodztwo = wojewodztwo; 
    } 
} 

使用它(縣)類:

@Entity 
@Table(name = "POWIAT") 
@IdClass(GusPowiatPK.class) 
public class GusPowiat { 

    private Short powiatNr; 
    private GusWojewodztwo wojewodztwo; 
    private String nazwa; 
    private Date stanNa; 
    private boolean powiatMiejski; 

    public GusPowiat() { 
     super(); 
    } 

    public GusPowiat(Short powiatNr, GusWojewodztwo wojewodztwo) { 
     super(); 
     this.powiatNr = powiatNr; 
     this.wojewodztwo = wojewodztwo; 
    } 

    @Id 
    public Short getPowiatNr() { 
     return powiatNr; 
    } 

    public void setPowiatNr(Short powiatNr) { 
     this.powiatNr = powiatNr; 
    } 

    @Id 
    public GusWojewodztwo getWojewodztwo() { 
     return wojewodztwo; 
    } 

    public void setWojewodztwo(GusWojewodztwo wojewodztwo) { 
     this.wojewodztwo = wojewodztwo; 
    } 

    @Column(name = "NAZWA", length = 50, nullable = false) 
    public String getNazwa() { 
     return nazwa; 
    } 

    public void setNazwa(String nazwa) { 
     this.nazwa = nazwa; 
    } 

    @Temporal(TemporalType.DATE) 
    @Column(name = "STAN_NA", nullable = false) 
    public Date getStanNa() { 
     return stanNa; 
    } 

    public void setStanNa(Date stanNa) { 
     this.stanNa = stanNa; 
    } 

    @Column(name = "POW_MIEJSKI") 
    public boolean isPowiatMiejski() { 
     return powiatMiejski; 
    } 

    public void setPowiatMiejski(boolean powiatMiejski) { 
     this.powiatMiejski = powiatMiejski; 
    } 
} 

構成組合鍵(省)的班級:

@Entity 
@Table(name = "WOJEWODZTWO") 
public class GusWojewodztwo { 

    private Short id; 
    private String nazwa; 
    private Date stanNa; 

    public GusWojewodztwo() { 
     super(); 
    } 

    public GusWojewodztwo(Short id) { 
     super(); 
     this.id = id; 
    } 

    @Id 
    @Column(name = "WOJ_ID") 
    public Short getId() { 
     return id; 
    } 

    public void setId(Short id) { 
     this.id = id; 
    } 

    @Column(name = "NAZWA", length = 50, nullable = false) 
    public String getNazwa() { 
     return nazwa; 
    } 

    public void setNazwa(String nazwa) { 
     this.nazwa = nazwa; 
    } 

    @Temporal(TemporalType.DATE) 
    @Column(name = "STAN_NA", nullable = false) 
    public Date getStanNa() { 
     return stanNa; 
    } 

    public void setStanNa(Date stanNa) { 
     this.stanNa = stanNa; 
    } 
} 
+0

我不明白爲什麼應該使用IdClass,因爲我需要重新定義類中的相同字段。我希望能夠使它與EmbeddedId一起工作 – brainydexter 2012-03-29 11:47:39

0

應用於實體類或映射超類的持久字段或屬性,以表示作爲可嵌入類的組合主鍵。可嵌入的類必須標註爲Embeddable。 使用EmbeddedId批註時,只能有一個EmbeddedId批註和沒有Id批註。

AttributeOverride註釋可用於覆蓋可嵌入類中聲明的列映射。

MapsId註釋可以與EmbeddedId註釋一起使用以指定派生的主鍵。

如果實體具有派生主鍵,則AttributeOverride註釋可能只能用於覆蓋嵌入ID的那些與父實體關係不對應的屬性。