فشل في تهيئة مجموعة من الأدوار بتكاسل:com.pojo.Student.phonenos، لم يتم إغلاق أي جلسة أو جلسة

StackOverflow https://stackoverflow.com/questions/7832433

سؤال

أنا أتعلم رسم خرائط السبات باستخدام التعليق التوضيحي.لقد أكملت قسم واحد.أي.يمكنني إدراج فئة فرعية تلقائيًا عندما أحفظ الجدول الأصلي. أنظر لهذا.

لكنني لم أحصل على الجدول الفرعي عندما أقوم بإحضار الجدول الرئيسي.الحصول على خطأ أيضا

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

تمت إضافة الرمز الخاص بي هنا لمراجعتك.يرجى الذهاب من خلال ذلك.وأعطني النصيحة العظيمة.Student.java.(فئة الوالدين)

@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) ما هو حريص ويتكاسل في الجلب.

3) الاتجاه الأحادي، والاتجاه الثنائي، وجدول الانضمام في حالة تعيين واحد إلى متعدد، أيهما أكثر قوة.

هل كانت مفيدة؟

المحلول

1)

إذا كنت تريد حقًا القيام بذلك في كل مرة يتم فيها استرداد أي كيان من هذه الفئات، فحدد FetchMode.EAGER في ال @OneToMany منظمة. @ManyToOne حريصون بشكل افتراضي.انتبه إلى أن هذا قد يكون غير فعال إلى حد كبير إذا كنت بحاجة إلى جلب تلك الكيانات في ظروف معينة فقط.إذا كان الأمر كذلك، عليك أن تفعل ذلك كما تفعل، ولكن تأكد من أن الجلسة التي استردت Student الكائن لا يزال مفتوحا.نظرًا لأنك تستخدم Spring، هل حاولت إضافة تعليقات توضيحية إلى DAO/الخدمة باستخدام @Transactional, ، بحيث تظل الجلسة حية أثناء تنفيذ الطريقة؟أو هل حاولت استخدام Hibernate.execute(), ، مثله:

 

   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) ألق نظرة على هذا السؤال: الفرق بين FetchType LAZY و EAGER في ثبات Java؟.

3) ذلك يعتمد على ما تحتاجه.إذا كنت تحتاج فقط إلى التنقل في الارتباط بطريقة واحدة، فحدده أحادي الاتجاه بهذه الطريقة فقط.إذا كنت بحاجة إلى كليهما، فافعل كلاهما.يرتبط Join Table بتصميم قاعدة البيانات.إذا كنت ترغب في الحصول على FK في Phone الجدول مع الإشارة إلى Student ينتمي الهاتف إلى، أو تريد أن يكون لديك جدول ربط مع Phones كل Student.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top