這是讓我困惑的一個。我正在嘗試實現基本的Hibernate DAO結構,但是遇到了問題。這是基本代碼:int startingCount = sfdao.count();sfdao.create( sf );SecurityFiling sf2 = sfdao.read( sf.getId() );sfdao.delete( sf );int endingCount = sfdao.count();assertTrue( startingCount == endingCount );assertTrue( sf.getId().longValue() == sf2.getId().longValue() );assertTrue( sf.getSfSubmissionType().equals( sf2.getSfSubmissionType() ) );assertTrue( sf.getSfTransactionNumber().equals( sf2.getSfTransactionNumber() ) );它在嘗試將sf中的值與sf2中的對應值進行比較的第三個assertTrue上失敗。這是例外:org.hibernate.LazyInitializationException: could not initialize proxy - no Session at org.hibernate.proxy.AbstractLazyInitializer.initialize(AbstractLazyInitializer.java:86) at org.hibernate.proxy.AbstractLazyInitializer.getImplementation(AbstractLazyInitializer.java:140) at org.hibernate.proxy.pojo.javassist.JavassistLazyInitializer.invoke(JavassistLazyInitializer.java:190) at com.freightgate.domain.SecurityFiling_$$_javassist_7.getSfSubmissionType(SecurityFiling_$$_javassist_7.java) at com.freightgate.dao.SecurityFilingTest.test(SecurityFilingTest.java:73) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:40)
3 回答

滄海一幻覺
TA貢獻1824條經驗 獲得超5個贊
問題是您試圖訪問分離對象中的集合。您需要在訪問當前會話的集合之前重新附加對象。您可以通過
session.update(object);
使用lazy=false不是一個好的解決方案,因為您將放棄休眠的惰性初始化功能。如果為lazy=false,則在請求對象的同時將集合加載到內存中。這意味著,如果我們有一個包含1000個項目的集合,則無論我們是否要訪問它們,它們都將被加載到內存中。這不好。
請閱讀本文,其中解釋了問題,可能的解決方案以及為什么以這種方式實現。

交互式愛情
TA貢獻1712條經驗 獲得超3個贊
這通常意味著擁有的Hibernate會話已經關閉。您可以執行以下任一操作來修復它:
使用哪個對象創建此問題,請使用 HibernateTemplate.initialize(object name)
使用lazy=false您的HBM文件。

慕哥9229398
TA貢獻1877條經驗 獲得超6個贊
如果您將休眠與JPA注釋一起使用,則這將很有用。在您的服務類中,應該使用@PersistenceContext為實體管理器設置一個設置器。將其更改為@PersistenceContext(type = PersistenceContextType.EXTENDED)。然后,您可以在任何地方訪問惰性屬性。
添加回答
舉報
0/150
提交
取消