我正在使用带有JPA的hibernate 4.2.4和在ManyToMany关联中的layz加载.对象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;
}
Run Code Online (Sandbox Code Playgroud)
最初我曾经让连接打开,导致如果我的应用程序需要做一些延迟加载,第一次调用后仍然需要会话.但是,虽然这使我的应用程序在一些操作后冻结,但我偶然发现了之前的策略.现在一切正常; 没有冻结,没有延迟加载的问题.但是,如果我加载一个实体,它有一些孩子(需要延迟加载),日志说:
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
Run Code Online (Sandbox Code Playgroud)
有意义的是,hibernate没有关闭会话(实际上我认为有一个新的使用新会话的延迟加载请求)连接池识别出有一个未使用的会话.但最终hibernate正在修复我的"糟糕的会话处理".
那么有谁知道更好的方法来处理与延迟加载一起使用的会话?
当然,我们需要关闭会话,否则应用程序可能无法正常工作。
此外,我们应该尝试保持嵌套对象惰性以获得更好的性能并添加强制连接。
如果您需要访问子元素,则必须在查询中应用联接,以便加载惰性对象,例如:
class A{
B b;
}
Run Code Online (Sandbox Code Playgroud)
sql:
select * from A Left join B on A.bid = B.id
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1672 次 |
| 最近记录: |