2009-02-02 15 views
7

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

परिदृश्य निम्न है: मेरे पास एक से अधिक माता-पिता संबंध हैं। मैं इस संबंध को एक बिडरेक्शनल सूची के साथ मैप करता हूं।

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 का उपयोग कर रहा हूं।

मुझे क्या याद आ रही है? क्या हाइबरनेट संदर्भ मार्गदर्शिका सही नहीं है, या क्या मैं कुछ दिख रहा हूं?

उत्तर

6

ठीक है, मैं एनोटेशन रेफरेंस गाइड को पूरी तरह से पर्याप्त नहीं पढ़ रहा था।

अध्याय 2.2.5.3.1.1. Bidirectional में यह स्पष्ट रूप से कहा गया है:

मालिक पक्ष के रूप में एक-से-कई पक्ष के साथ कई लोगों के लिए एक द्विदिश एक नक्शा करने के लिए, आप mappedBy तत्व को हटाने और एक के लिए कई सेट करने के लिए @JoinColumn को सम्मिलनीय और गलत करने के लिए अद्यतन करने योग्य। यह समाधान स्पष्ट रूप से अनुकूलित नहीं है और कुछ अतिरिक्त अद्यतन विवरण का उत्पादन करेगा।

शायद यह जानकारी Chapter 2.4.6.2.1. Bidirectional association with indexed collections में दोहराने के लिए कोई दिक्कत नहीं होगी।

अब सवाल बनी हुई है: यदि मैं माता-पिता पर @JoinColumn विशेषताओं 'updatable = false' और 'insertable = false' को दोहराता हूं (पहले पोस्ट में कोड देखें) अतिरिक्त अद्यतन कथन उत्पादित नहीं होते हैं ... है यह एक वैध कामकाज है? या क्या यह एक और समस्या में परिणाम देता है?