6

Tôi đang học lập bản đồ ngủ đông bằng chú thích. Tôi đã hoàn thành một phần. I E. Tôi có thể chèn lớp con tự động khi tôi lưu bảng cha. see_that.thất bại trong việc khởi tạo một tập hợp vai trò: com.pojo.Student.phonenos, không có phiên hoặc phiên nào bị đóng

Nhưng tôi đã không nhận được bảng con khi tôi đang tìm nạp bảng chính. Cũng gặp lỗi

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

Mã của tôi được thêm vào đây để đánh giá bạn. Xin vui lòng đi qua nó. Và cho tôi lời khuyên tuyệt vời. Student.java. (Lớp cha)

@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 (lớp con)

@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; 
    } 

lớp dao của tôi

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; 
    } 

Out đặt là

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

Ở đây tôi đang sử dụng một chiều (khoá ngoài) ánh xạ một-nhiều (không phải j bảng oint, hai chiều).

Summerizing câu hỏi của tôi

1) làm thế nào để có được bảng con khi chúng ta lấy bảng cha, ngược lại

2) những gì là háo hức và lười biếng lấy.

3) unidirection, bidirection và tham gia bảng trong trường hợp lập bản đồ một-nhiều, cái nào có nhiều quyền lực hơn.

Trả lời

5

1)

Nếu bạn muốn thực sự để làm điều này mỗi khi bất kỳ thực thể của các lớp này được lấy ra, chỉ định FetchMode.EAGER trong hiệp hội @OneToMany. @ManyToOne đang háo hức theo mặc định. Lưu ý rằng điều này có thể phần lớn không hiệu quả nếu bạn chỉ cần tìm nạp các thực thể đó trong các trường hợp cụ thể. Nếu đúng như vậy, bạn phải làm như bạn đang làm, nhưng hãy đảm bảo rằng phiên truy xuất đối tượng Student vẫn mở. Thấy rằng bạn đang sử dụng Spring, bạn đã thử chú thích DAO/Service của mình với @Transactional, sao cho phiên vẫn tiếp tục hoạt động trong khi thực thi phương pháp? Hoặc bạn đã cố gắng sử dụng Hibernate.execute(), như thế này:

 

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) Hãy nhìn vào câu hỏi này: Difference between FetchType LAZY and EAGER in Java persistence?.

3) Tùy thuộc vào những gì bạn cần. Nếu bạn chỉ cần điều hướng liên kết theo một cách, hãy xác định nó theo một cách duy nhất theo cách đó. Nếu bạn cần cả hai, hãy làm cả hai. Tham gia Bảng có nhiều việc phải làm với thiết kế cơ sở dữ liệu. Nếu bạn muốn có FK trong bảng Phone có tham chiếu đến số Student điện thoại thuộc về hoặc bạn muốn có bảng tham gia với Phones của mỗi Student.

+0

Mã pice không hoạt động ... getHibernateTemplate(). Execute (new HibernateCallback() biên dịch lỗi. – jaleel

+0

Tnx. bạn cho phát lại .. mong đợi giải pháp. – jaleel

+0

Bạn đã thử chú thích DAO hoặc phương thức với '@ Transactional' chưa? Bạn có một transactionManager trong applicationContext.xml của bạn? –

Các vấn đề liên quan