فشل في تهيئة مجموعة من الأدوار بتكاسل:com.pojo.Student.phonenos، لم يتم إغلاق أي جلسة أو جلسة
-
27-10-2019 - |
سؤال
أنا أتعلم رسم خرائط السبات باستخدام التعليق التوضيحي.لقد أكملت قسم واحد.أي.يمكنني إدراج فئة فرعية تلقائيًا عندما أحفظ الجدول الأصلي. أنظر لهذا.
لكنني لم أحصل على الجدول الفرعي عندما أقوم بإحضار الجدول الرئيسي.الحصول على خطأ أيضا
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
.