我在ManyToMany关联中使用带有JPA和layz加载的hibernate 4.2.4。对象 A 与对象 A 相关联@ManyToMany(targetEntity=B.class, fetch=FetchType.LAZY)
,反之亦然。要从数据库中获取数据,我调用以下(简化的)代码:
try {
session = cutSessionFactory.openSession();
session.beginTransaction();
List<IBO> result = session.createQuery(query).list();
session.getTransaction().commit();
return result;
catch{...}
finally{
session.close;
}
最初我习惯让连接打开,因为如果我的应用程序需要做一些延迟加载,那么在第一次调用之后仍然需要会话。但是,虽然这使我的应用程序在某些操作后冻结,但我偶然采用了以前的策略。现在一切正常;没有冻结,延迟加载没有问题。但是如果我加载一个实体,它有一些孩子(需要延迟加载),日志会显示:
WARN - AbstractPersistentCollection: Unable to close temporary session used to load lazy collection associated to no session
其次是
2013-09-25 09:35:30 - INFO - BasicResourcePool: A checked-out resource is overdue, and will be destroyed: com.mchange.v2.c3p0.impl.NewPooledConnection@15f52a7
2013-09-25 09:35:30 - INFO - BasicResourcePool: Logging the stack trace by which the overdue resource was checked-out
休眠没有关闭会话是有道理的(实际上我认为有一个使用新会话的延迟加载的新请求)连接池识别出有一个未使用的会话。但最终休眠正在修复我的“糟糕的会话处理”。
那么有没有人知道更好的方法来处理延迟加载使用的会话?