2011-07-06 12 views
5

मैं db के इस स्कीमा है:हाइबरनेट जेपीए एनोटेशन: एंबेडेड आईडी के साथ समस्या

Table_A [1] -> [n] Table_C और Table_B [1] -> [n] Table_C

अब, Table_C की प्राथमिक कुंजी एक एम्बेडेड आईडी है जिसमें विदेशी कुंजी बनाम Table_A और विदेशी कुंजी बनाम Table_B है। मैं इस एनोटेशन को कैसे नोट करूं?

मेरे समाधान है:

@Entity 
public class TableA{ 
    @Id @column(name="ID") 
    public int id; 

    @OneToMany(mappedBy="tableA") 
    public List<TableC> listOftableC; 
} 

@Entity 
public class TableB{ 
    @Id @column(name="ID") 
    public String id; 

    @OneToMany(mappedBy="tableB") 
    public List<TableC> listOftableC; 

} 

@Entity 
public class TableC{ 
    @EmbeddedId 
    public TableCPK idComposite; 
} 

@Embeddable 
public class TableCPK{ 

    @ManyToOne 
    @JoinColumn(name = "ID_TABLE_A", referencedColumnName="ID") 
    public TableA tableA; 

    @ManyToOne 
    @JoinColumn(name = "ID_TABLE_B", referencedColumnName="ID") 
    public TableA tableB; 
} 
+0

संबंध बिडरेक्शनल – giulius

उत्तर

5

जब आप जेपीए कल्पना का पालन करें, आप ध्यान देंगे tableC मैप करने के लिए कोई जरूरत नहीं है कि। तुम सिर्फ इस

@Entity 
public class TableA{ 
    @Id 
    @column(name="ID") 
    public int id; 
    @ManyToMany 
    @JoinTable(name="TableC", 
      joinColumns = {@JoinColumn(name = "ID_TABLE_A", referencedColumnName="ID")}, 
      inverseJoinColumns = {@JoinColumn(name = "ID_TABLE_B", referencedColumnName="ID") 
    }) 
    public List<TableB> listOftableB; 
} 
@Entity 
public class TableB{ 
    @Id @column(name="ID") 
    public String id; 
    @OneToMany(mappedBy="listOftableB") 
    public List<TableA> listOftableA; 
} 

की तरह एक jointable

कुछ का उपयोग कर सकते है अगर आप JoinTable में कुछ मैप करना चाहते हैं तो आप भी एक इकाई के रूप में यह परिभाषित कर सकते हैं। आप tableC इस

@Entity 
public class TableC{ 
    @EmbeddedId 
    private MyId id; 
    @ManyToOne 
    @JoinColumn(name = "ID_TABLE_A", insertable = false, updatable = false) 
    private TableB tableA; 
    @ManyToOne 
    @JoinColumn(name = "ID_TABLE_B", insertable = false, updatable = false) 
    private TableB tableB; 

    @Column(name="extra_field") 
    private String extraField; 
} 

@Embeddable 
public class MyId{ 
    @Column(name="ID_TABLE_A") 
    private int idTableA; 
    @Column(name="ID_TABLE_B") 
    private int idTableB; 
    // equals, hascode,... 
} 

तरह मैप कर सकते हैं वस्तुओं insertable/updatable झूठे बनाकर, आप एक ही गुण को कई बार देख सकते हैं। आईडी में अन्य गुण अपरिवर्तनीय नहीं हैं, क्योंकि आप अपना पीके तोड़ देंगे।

+0

होना चाहिए यदि तालिका सी में अन्य विशेषताएँ हैं जिन्हें मैप किया जाना चाहिए? मैं उन्हें कैसे मैप कर सकता हूं? – giulius

+0

मेरा पिछला आयनसर आपके प्रश्न के लिए कोई सीधा आंगन नहीं था, मैंने इसे विस्तारित किया है। – jelle

+0

मेरे प्रश्न के लिए, आपके पास एक समाधान है? – giulius

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