19

私はIDHOLIDAYPACKAGEHolidayPackageVariantHolidayPackage多く一つに関係してHolidayPackageエンティティを指しテーブルHolidayPackageVariantで複合主キー(IDHOLIDAYPACKAGE, IDHOLIDAYPACKAGEVARIANT)を持っています。私のEmbeddedIdが休止状態にならないのはなぜですか?

私はHolidayPackageVariantでcompundの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

誰かが私がここで間違って何をやっている私に教えていただけますか?

MY POJOのは次のようになります。私は@EmbeddedIdで一度戦ってきた、と私は同じ目標を達成し終えた

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

こんにちは@brainydexter、この質問への正しい答えを変更してください。私はそれを修正しなければならなかったし、ここに戻ってきて、それが既にそこにあることを認識するためだけに答えを投稿する。 – coderatchet

+1

@coderatchet done。それを指摘してくれてありがとう。これは私のレーダーから落ちたので、もはや冬眠のものをやっていない。 – brainydexter

答えて

77

クラスには@Idが含まれていてはいけません。 HolidayPackageVariantPrimaryKeyId注釈を削除しても問題ありません。

+4

で動作させることを望んでいました。これも私の問題を解決しました。私は、これが以前のものの代わりに答えとしてマークされるべきだと思います。 – Jalpesh

+2

これは正しい答えです。 –

+0

しかし、私は何をしますか?メンバーを挿入するたびに自動的に値を取得するためにメンバーの 'private Long id;'を '@ Embedded'に入れたいのですか?これは[私がちょうど得ていない](http://stackoverflow.com/questions/29976363/hibernate-generatedvalue-in-embedded-always-null)... – displayname

2

@IdClass。違いは、@IdClassを使用するときはクラス定義で使用しないで、同じフィールドを再宣言します(ただし、私はより快適なidフィールドのgetter/setterを直接指定しています)。

複合キー:それを使用して

@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; 
    } 
} 

クラス(郡):

ここ

は、私はポーランド政府機関のGUSから自由に利用できるアドレスデータベースを処理するために使用したプロジェクトから、私の例であります

@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を使用する必要がある理由についてはわかりません。私はそれを埋め込みコード – brainydexter

0

埋め込み可能なクラスである複合主キーを示すために、エンティティクラスまたはマップされたスーパークラスの永続フィールドまたはプロパティに適用されます。埋め込み可能なクラスには埋め込み可能なものとして注釈を付ける必要があります。 EmbeddedId注釈が使用される場合、1つのEmbeddedId注釈と1つのId注釈のみが必要です。

AttributeOverrideアノテーションを使用して、埋め込み可能クラス内で宣言された列マッピングをオーバーライドすることができます。

MapsIdアノテーションは、派生主キーを指定するためにEmbeddedIdアノテーションと組み合わせて使用​​できます。

エンティティが派生主キーを持っている場合、AttributeOverrideアノテーションは、親エンティティとの関係に対応していない埋め込みIDのこれらの属性をオーバーライドするために使用することができます。

関連する問題