[英]Hibernate could not initialize proxy - no Session
我的代碼檢索與用戶相關的所有信息:
SessionFactory sessionFactory = HibernateUtilities.configureSessionFactory();
Session session = sessionFactory.openSession();
UserDetails ud = null;
Set<Address> userAddress = null;
try {
session.beginTransaction();
ud = (UserDetails) session.get(UserDetails.class, 1);
userAddress = ud.getAddresses();
session.getTransaction().commit();
} catch (HibernateException e) {
e.printStackTrace();
session.getTransaction().rollback();
} finally {
session.close();
}
System.out.println(ud.getName());
for(Address addr: userAddress){
System.out.println("State " + addr.getState());
}
ud.getAddresses()
只返回用戶的一組Address
es。
我的問題是:為什么即使會話已經關閉, ud
對象仍然具有其值(例如,名稱)? getAddresses()
是UserDetails
類的實例變量。 但為什么我不能檢索它的值,但我可以檢索UserDetails
類的常規實例變量?
ud.getAddresses()
是一個@EmbeddedCollection
。
我在JPA / Hibernate中遇到了同樣的問題,有兩種方法可以解決這個問題:
1 /默認關閉LAZY,如下所示:
@Entity
@Proxy(lazy = false)
public class Project {
...
}
當然,由於性能問題,不建議采用這種方式,因此您可以采用第二種方式。
2 /您可以在方法的開頭放置@Transactional,它可以幫助您保持會話或其他理解,它將會話的任務傳遞給Hibernate,如下所示:
@Test
@Transactional
public void testSaveGroup() {
Department g = new Department();
g.setName("XDG");
assertNull(g.getId());
this.groupRepo.save(g);
assertNotNull(g.getId());
System.out.println(g.getId());
Project dummyPrj = new Project(123L, "KSTA", new Date(), "NEW", "Helm AG", g);
this.projectRepo.save(dummyPrj);
// verify
List<Department> lst = this.groupRepo.findAll();
Project savedPrj = this.projectRepo.getOne(123L);
Assert.assertEquals("XDG", savedPrj.getGroup().getName());
}
我的回答很晚,但希望能幫助別人:)
userAddress = ud.getAddresses();
session.getTransaction().commit();
for(Address addr: userAddress) {
用於處理惰性關聯的hibernate文檔明確地將這種訪問稱為錯誤。 只有在會話仍處於打開狀態時,您才能與延遲關聯的對象進行交互。 文檔的這一部分還提供了訪問對象的延遲關聯成員的替代方法,我們更傾向於在我們的應用程序中將獲取模式指定為使用標准中的JOIN。
類的所有原始屬性都會立即加載,除非您使用字節碼增強,否則它們不能延遲。 只有像你的收藏品這樣真正的聯想可能是懶惰的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.