Hibernate无法初始化代理 – 没有Session

我的代码检索与用户相关的所有信息:

SessionFactory sessionFactory = HibernateUtilities.configureSessionFactory(); Session session = sessionFactory.openSession(); UserDetails ud = null; Set
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

 userAddress = ud.getAddresses(); session.getTransaction().commit(); for(Address addr: userAddress) { 

用于处理惰性关联的hibernate文档明确地将这种访问称为错误。 只有在会话仍处于打开状态时,您才能与延迟关联的对象进行交互。 文档的这一部分还提供了访问对象的延迟关联成员的替代方法,我们更倾向于在我们的应用程序中使用的标准中将获取模式指定为JOIN。

我在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 lst = this.groupRepo.findAll(); Project savedPrj = this.projectRepo.getOne(123L); Assert.assertEquals("XDG", savedPrj.getGroup().getName()); } 

我的回答很晚,但希望能帮助别人:)

类的所有原始属性都会立即加载,除非您使用字节码增强function,否则它们不能延迟。 只有像你的collections品这样真正的联想可能是懒惰的。