19

मैं मेज HolidayPackageVariant जहां IDHOLIDAYPACKAGEHolidayPackageVariant और HolidayPackage जो कई एकके रिश्ते के साथ इकाई HolidayPackage को संदर्भित करता है में एक यौगिक प्राथमिक कुंजी (IDHOLIDAYPACKAGE, IDHOLIDAYPACKAGEVARIANT) है।हाइबरनेट में मेरा एंबेडेड आईडी क्यों काम नहीं कर रहा है?

जब मैं HolidayPackageVariant में compund पी मानचित्रण करने की कोशिश, मैं निम्न त्रुटि हो:

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

कोई मुझे बता सकते हैं क्या मैं गलत यहाँ कर रहा हूँ?

मेरी POJOs इस तरह दिखेगा:

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

@ कोडरैटचेट किया गया। इस पर ध्यान दिलाने के लिए धन्यवाद। अब हाइबरनेट सामान नहीं कर रहा है इसलिए यह मेरे रडार से गिर गया। – brainydexter

उत्तर

77

आप EmbeddedId कक्षा में @Id नहीं होना चाहिए। अपने HolidayPackageVariantPrimaryKey में Id एनोटेशन निकालें और इसे ठीक काम करना चाहिए।

+4

के साथ काम करने की उम्मीद कर रहा था, यह मेरी समस्या भी तय करता है। मुझे लगता है कि इसे पिछले के बजाय उत्तर के रूप में चिह्नित किया जाना चाहिए। – Jalpesh

+2

ऐसा लगता है कि यह सही जवाब है –

+0

लेकिन मैं क्या करूँगा उदा। अगर मैं एक सदस्य 'निजी लांग आईडी' चाहता हूं, तो प्रत्येक बार जब मैं कोई तत्व डालता हूं तो ऑटो-वैल्यू प्राप्त करने के लिए मेरे '@ एंबेडेड'' में? यह है [जो मुझे अभी नहीं मिल रहा है] (http://stackoverflow.com/questions/29976363/hibernate-generatedvalue-in-embedded-always-null) ... – displayname

2

मैं @EmbeddedId के साथ एक बार लड़ा है, और मैं के साथ एक ही लक्ष्य को प्राप्त करने समाप्त कर लें @IdClass। अंतर यह है कि जब आप @IdClass उपयोग करते हैं, आप वर्ग परिभाषा उसका उपयोग नहीं करते हैं, लेकिन आप एक ही क्षेत्र (हालांकि, मैं आईडी क्षेत्रों के लिए तो प्रत्यक्ष getters/setters जो मेरे लिए और अधिक आरामदायक है,) redeclare।

यहाँ मेरी उदाहरण है, इस परियोजना से मैं पोलिश सरकार संस्था गस से स्वतंत्र रूप से उपलब्ध पता डेटाबेस कार्रवाई करने के लिए उपयोग करें:

समग्र कुंजी:

@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

मुझे यह नहीं पता कि क्यों आईडीडैस का उपयोग करना चाहिए क्योंकि मुझे कक्षा में एक ही फ़ील्ड को फिर से परिभाषित करने की आवश्यकता है। मैं इसे एंबेडेड आईडी – brainydexter

0

एक लगातार क्षेत्र या एक इकाई वर्ग की संपत्ति पर लागू होती है या मैप किए गए सुपर क्लास एक समग्र प्राथमिक कुंजी है कि किसी एम्बेड वर्ग है निरूपित करने के लिए। एम्बेड करने योग्य वर्ग को एम्बेड करने योग्य के रूप में एनोटेट किया जाना चाहिए। सिर्फ एक ही EmbeddedId एनोटेशन और कोई ईद एनोटेशन जब EmbeddedId एनोटेशन प्रयोग किया जाता है होना चाहिए।

AttributeOverride एनोटेशन स्तंभ मैपिंग एम्बेड करने योग्य वर्ग के भीतर घोषित ओवरराइड करने के लिए इस्तेमाल किया जा सकता है।

MapsId एनोटेशन एक व्युत्पन्न प्राथमिक कुंजी निर्दिष्ट करने के लिए EmbeddedId टिप्पणी के साथ संयोजन के रूप में इस्तेमाल किया जा सकता है।

यदि इकाई में व्युत्पन्न प्राथमिक कुंजी है, तो विशेषता ऑवर्राइड एनोटेशन केवल एम्बेडेड आईडी के उन विशेषताओं को ओवरराइड करने के लिए उपयोग किया जा सकता है जो मूल इकाई से संबंधों के अनुरूप नहीं हैं।

संबंधित मुद्दे