簡體   English   中英

Hibernate無法初始化代理 - 沒有Session

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM