6

मैं एनोटेशन का उपयोग करके हाइबरनेट मैपिंग सीख रहा हूं। मैंने एक सेक्शन पूरा कर लिया है। अर्थात। जब मैं अभिभावक तालिका को सहेजता हूं तो मैं स्वचालित रूप से बाल वर्ग को सम्मिलित कर सकता हूं। see_thatआलसी रूप से भूमिका के संग्रह को शुरू करने में असफल रहा: com.pojo.Student.phonenos, कोई सत्र या सत्र बंद नहीं किया गया

लेकिन जब मैं मास्टर टेबल ला रहा हूं तो मुझे बाल तालिका नहीं मिली। इसके अलावा एक त्रुटि

failed to lazily initialize a collection of role: com.pojo.one2many.unidirectional.Student.phonenos, no session or session was closed 

मेरा कोड आपकी समीक्षा करने के लिए यहां जोड़ा गया है। कृपया इसके माध्यम से जाओ। और मुझे महान सलाह दें। छात्र.जावा। (मूल वर्ग)

@Entity 
    @Table(name="STUDENT") 
    public class Student { 
    private int studentid; 
    private String studentName; 
    private Set <Phone> phonenos; 

    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    @Column(name="studenId") 
    public int getStudentid() { 
     return studentid; 
    } 
    public void setStudentid(int studentid) { 
     this.studentid = studentid; 
    } 
    @Column(name="studenName") 
    public String getStudentName() { 
     return studentName; 
    } 
    public void setStudentName(String studentName) { 
     this.studentName = studentName; 
    } 
    @OneToMany(fetch = FetchType.LAZY) 
    @JoinColumn(name="studenId") 
    public Set<Phone> getPhonenos() { 
     return phonenos; 
    } 
    public void setPhonenos(Set<Phone> phonenos) { 
     this.phonenos = phonenos; 
    } 

Phone.java (बच्चे वर्ग)

@Entity 
@Table(name = "PHONE") 
public class Phone { 
    private int phoneid; 
    private String phoneNo; 
    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    @Column(name = "phoneId") 
    public int getPhoneid() { 
     return phoneid; 
    } 
    public void setPhoneid(int phoneid) { 
     this.phoneid = phoneid; 
    } 
    @Column(name = "phoneno") 
    public String getPhoneNo() { 
     return phoneNo; 
    } 
    public void setPhoneNo(String phoneNo) { 
     this.phoneNo = phoneNo; 
    } 

मेरी दाव वर्ग

public List<Student> getAllStudent() { 
     List<Student> studentList = null; 
     try { 
      DetachedCriteria criteria = DetachedCriteria.forClass(Student.class); 
      studentList = (List<Student>)getHibernateTemplate().findByCriteria(criteria); 
       if(studentList != null && ! studentList.isEmpty()){ 
       for(Student st :studentList){ 
        System.out.println(" st name : "+st.getStudentName()); 
        if(st.getPhonenos() != null && ! st.getPhonenos().isEmpty()){ 
         for(Phone ph : st.getPhonenos()){ 
          System.out.println(" ph no : "+ ph.getPhoneNo()); 
         } 
        }else{ 
         System.out.println(" phone number is null"); 
        } 
       } 
      }else{ 
       System.out.println(" student null"); 
      } 
     } catch (DataAccessException e) { 
      e.printStackTrace(); 
     } 
     return studentList; 
    } 

डाल बाहर

failed to lazily initialize a collection of role: com.pojo.one2many.unidirectional.Student.phonenos, no session or session was closed 

यहाँ मैं दिशाहीन का उपयोग कर रहा है (विदेशी कुंजी) एक से कई मैपिंग (जे नहीं ओंट टेबल, बिडरेक्शनल)।

मेरे सवाल

1) कैसे बच्चे मेज पाने के लिए जब हम माता-पिता की मेज लाने, इसके विपरीत

2) क्या उत्सुक और आलसी लाने है Summerizing।

3) एक-से-कई मैपिंग के मामले में यूनिडायरेक्शन, बिडरेक्शन, और तालिका में शामिल होने के लिए जो अधिक शक्ति भरा है।

उत्तर

5

1)

आप वास्तव में इस पर हर बार है कि इन वर्गों के किसी भी संस्था लिया गया है क्या करना चाहते हैं, तो @OneToMany सहयोग से FetchMode.EAGER निर्दिष्ट करें। @ManyToOne डिफ़ॉल्ट रूप से उत्सुक हैं। सावधान रहें कि यदि आप केवल उन परिस्थितियों को विशेष परिस्थितियों में लाने की आवश्यकता है तो यह काफी हद तक अक्षम हो सकता है। यदि ऐसा है, तो आपको ऐसा करना होगा जैसे आप कर रहे हैं, लेकिन सुनिश्चित करें कि Student ऑब्जेक्ट पुनर्प्राप्त करने वाला सत्र अभी भी खुला है। यह देखते हुए कि आप वसंत का उपयोग कर रहे हैं, क्या आपने @Transactional के साथ अपनी डीएओ/सेवा को एनोटेट करने का प्रयास किया है, ताकि सत्र विधि निष्पादन के दौरान सत्र जीवंत रहता है? या फिर आप Hibernate.execute() उपयोग करने की कोशिश की है, इस तरह: Difference between FetchType LAZY and EAGER in Java persistence?:

 

getHibernateTemplate().execute(new HibernateCallback(){ 
    @SuppressWarnings("unchecked") 
    public Object doInHibernate(Session s) throws HibernateException, SQLException { 
     Criteria c = s.createCriteria(Student.class); 
     List<Student> studentList = c.list(); 
     for(Student st :studentList){ 
      st.getPhoneNos(); 
     } 
    } 
}); 

2) इस सवाल पर एक नजर डालें।

3) यह आपके लिए आवश्यक चीज़ों पर निर्भर करता है। यदि आपको केवल एक ही तरीके से एसोसिएशन को नेविगेट करने की आवश्यकता है, तो इसे केवल उसी तरह से एकजुट करें। यदि आपको दोनों की जरूरत है, तो दोनों करें। तालिका में शामिल हों डेटाबेस डिज़ाइन के साथ और अधिक करना है। यदि आप Phone तालिका में Student के संदर्भ में FK रखना चाहते हैं तो फ़ोन संबंधित है, या आप प्रत्येक Student के Phones के साथ एक तालिका में शामिल होना चाहते हैं।

+0

कोड का पासा काम नहीं कर रहा है ... getHibernateTemplate() निष्पादित करें (नया HibernateCallback() संकलन त्रुटि। – jaleel

+0

टीएनएक्स। आप replay के लिए .. समाधान की उम्मीद है। – jaleel

+0

क्या आपने डीएओ या 'ट्रांजेक्शनल' के साथ विधि को एनोटेट करने का प्रयास किया है? क्या आपके पास अपने एप्लिकेशन Context.xml में एक लेनदेन प्रबंधक है? –

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