我相信Hibernate默认为延迟初始化。因此,当您在会话中加载Foos列表时,在尝试使用它们之前,不会加载任何与它们关联的Bar。到那时,您已经关闭了会话,从而导致错误。
一些潜在的解决方案:
- 启用对Foo-Bar关联的热切获取
- 在获取时“加入”(实际上是急切的获取)
- 尝试在会话中访问Bar(这将起作用,但是您正在调用Foo.getBar()只是为了加载关联的Bar对象)
评论更新:
用于会话/事务管理的惯用语:
Session sess = factory.openSession();Transaction tx; try { tx = sess.beginTransaction(); //do some work ... tx.commit(); } catch (Exception e) { if (tx!=null) tx.rollback(); throw e; } finally { sess.close(); }重新附加“分离的”对象(基于参考文档):
如果对象已被修改:在新会话中更新对象
// in the first sessionCat cat = (Cat) firstSession.load(Cat.class, catId);Cat potentialMate = new Cat();firstSession.save(potentialMate);// in a higher layer of the applicationcat.setMate(potentialMate);// later, in a new sessionsecondSession.update(cat); // update catsecondSession.update(mate); // update mate
如果对象未修改,则可以使用lock():
//just reassociate:sess.lock(fritz, LockMode.NONE);//do a version check, then reassociate:sess.lock(izi, LockMode.READ);//do a version check, using SELECT ... FOR UPDATE, then reassociate:sess.lock(pk, LockMode.UPGRADE);



