,同時學習一些關於休眠我碰到著名的延遲初始化例外情況如下所述情況Hibernate延遲初始化的問題
我有一個具有參照其他B類和使用Hibernate我嘗試加載類A類A使用ID和比最後,我試圖打印冬眠可能已經初始化的對象B類思維的一些性質的會議之後,但它所作的只是一個代理對象,這裏是代碼卡
Session session=HibernateUtil.getSessionFactory().openSession();
Transaction tx = session.getTransaction();
try {
tx.begin();
a=(A)session.load(A.class, "40288184318d9a3c01318d9a3eea0001");
tx.commit();
} catch (Exception e) {
log.error("Unable to complete the transcation"
+ "Transcation will be roll backed", e);
e.printStackTrace();
tx.rollback();
} finally {
log.info("Closing the session");
if (session != null && session.isOpen() == true){
session.close();
}
}
System.out.println(a.getUuid());
System.out.println(a.getB().getShortDescription());
System.out.println(a.getB().getLongDescription());
System.out.println(a.getB().getName());
驗證碼給我org.hibernate.LazyInitializationException: could not initialize proxy - no Session
,因爲我知道它給了我只有代理B和當我試圖讓乙休眠的特性拋出異常
我做我的代碼中的微小變化,它的工作好這裏是更改後的版本
Session session=HibernateUtil.getSessionFactory().openSession();
Transaction tx = session.getTransaction();
try {
tx.begin();
a=(A)session.load(A.class, "40288184318d9a3c01318d9a3eea0001");
tx.commit();
} catch (Exception e) {
e.printStackTrace();
tx.rollback();
} finally {
//log.info("Closing the session");
if (session != null && session.isOpen() == true){
b=des.getB();
session.close();
}
}
a.setB(b);
System.out.println(a.getUuid());
System.out.println(a.getB().getShortDescription());
System.out.println(a.getB().getLongDescription());
System.out.println(a.getB().getName());
}
雖然它的工作,但如果這個我不知道是否正確的方法,請建議
同意你的觀點,我已經聽說過這個,可以嘗試一下,關於第二個我想避免定製HQL的時間。關於第三個我正在做的,我所做的所有可能是錯誤的是,保存在另一個對象的引用,以備將來使用,因爲會話關閉不會讓我得到參考 –
只是一個補充我只有一個參考B在一個並且這不會是一個 –
@umesh中的b的集合,加載後立即調用'a.getB()'將允許您在將來的任何時候調用'getB()';無需保存參考... – hvgotcodes