के साथ एक बिडरेक्शनल सूची मैपिंग मैं बिडरेक्शनल सूची मैप करते समय हाइबरनेट के व्यवहार को समझ नहीं पा रहा हूं। एसक्यूएल कथन जो हाइबरनेट उत्पन्न करता है वह मेरे लिए अनुकूल नहीं लगता है। क्या कोई मुझे प्रबुद्ध कर सकता है?हाइबरनेट
परिदृश्य निम्न है: मेरे पास एक से अधिक माता-पिता संबंध हैं। मैं इस संबंध को एक बिडरेक्शनल सूची के साथ मैप करता हूं।
Hibernate Annotation Reference Guide के अनुसार (अध्याय: अनुक्रमित संग्रह के साथ द्वि-दिशा संघ) मानचित्रण इस तरह दिखना चाहिए:
@Entity
public class Parent {
@Id @GeneratedValue private long id;
@Version private int version;
private String name;
@OneToMany(cascade = CascadeType.ALL)
@JoinColumn(name = "parent_id", nullable=false)
@org.hibernate.annotations.IndexColumn(name = "parent_index")
List<Child> children = new ArrayList<Child>();
...
@Entity
public class Child {
@Id @GeneratedValue private Long id;
@Version private int version;
private String name;
@ManyToOne
@JoinColumn(name = "parent_id", updatable = false, insertable = false, nullable=false)
private Parent parent;
...
लेकिन इस मामले में हाइबरनेट तीन SQL कथन है जब एक बच्चे के साथ एक माता पिता बने पैदा करता है:
Hibernate: insert into Parent (name, version, id) values (?, ?, ?)
Hibernate: insert into Child (name, price, version, parent_id, parent_index, id) values (?, ?, ?, ?, ?, ?)
Hibernate: update Child set parent_id=?, parent_index=? where id=?
तीसरा कथन अनावश्यक प्रतीत होता है, क्योंकि parent_id
और parent_index
पहले से ही दूसरे कथन में सेट होने लगते हैं।
जब मैं मानचित्रण बदल सकते हैं और इस तरह से माता पिता में @JoinColumn की घोषणा करने के लिए विशेषताओं के updatable = false, insertable = false 'दोहराने:
@Entity
public class Parent {
@Id @GeneratedValue private long id;
@Version private int version;
private String name;
@OneToMany(cascade = CascadeType.ALL)
@JoinColumn(name = "parent_id", updatable = false, insertable = false, nullable=false)
@org.hibernate.annotations.IndexColumn(name = "parent_index")
List<Child> children = new ArrayList<Child>();
...
@Entity
public class Child {
@Id @GeneratedValue private Long id;
@Version private int version;
private String name;
@ManyToOne
@JoinColumn(name = "parent_id", updatable = false, insertable = false, nullable=false)
private Parent parent;
...
फिर ... हाइबरनेट और अधिक अनुकूलित एसक्यूएल निर्माण करने के लिए लगता है:
Hibernate: insert into Parent (name, version, id) values (?, ?, ?)
Hibernate: insert into Child (name, price, version, parent_id, parent_index, id) values (?, ?, ?, ?, ?, ?)
ग्राहक कोड इस तरह दिखता है:
+०१२३५१६४१०EntityManagerFactory emf = Persistence.createEntityManagerFactory("test");
EntityManager em = emf.createEntityManager();
EntityTransaction tx = em.getTransaction();
tx.begin();
Parent newParent = new Parent();
newParent.setName("Parent1");
Child newChild = new Child();
newChild.setName("Child1");
newParent.getChildren().add(newChild);
newChild.setParent(newParent);
em.persist(newParent);
em.flush();
tx.commit();
मैं हाइबरनेट-इकाई प्रबंधक 3.4.0.GA का उपयोग कर रहा हूं।
मुझे क्या याद आ रही है? क्या हाइबरनेट संदर्भ मार्गदर्शिका सही नहीं है, या क्या मैं कुछ दिख रहा हूं?