具有延迟加载的 hibernate session 处理

标签 hibernate

我正在使用带有 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;
}

最初我曾经让连接打开,因为如果我的应用程序需要做一些延迟加载,在第一次调用后仍然需要 session 。但是,虽然这使我的应用程序在一些操作后卡住,但我碰巧采用了以前的策略。现在一切正常;没有卡住,延迟加载没有问题。
但是如果我加载一个实体,它有一些 child (需要延迟加载),日志会说:
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

hibernate 没有关闭 session (实际上我认为有一个使用新 session 的延迟加载的新请求)是有道理的,连接池识别出有一个未使用的 session 。但最终 hibernate 正在修复我的“糟糕的 session 处理”。

那么有人知道处理延迟加载 session 的更好方法吗?

最佳答案

当然,我们需要关闭 session ,否则应用程序可能无法正常工作。

此外,我们应该尝试保持嵌套对象惰性以获得更好的性能并添加强制连接。

如果您需要访问子元素,则必须在查询中应用 join,以便加载惰性对象,例如:

class A{
      B b;
}

sql:
select * from A Left join B on A.bid = B.id

关于具有延迟加载的 hibernate session 处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19087397/

相关文章:

java - 将条目映射到 Hibernate 中的单独列

java - 为什么CascadeType.MERGE删除数据库中的记录

java - Spring Data JPA QueryDslPredicateExecutor 找到不同的结果

java - 与 Spring 和 JPA 的事务

java - 返回非持久数据作为对象的一部分

java - Hibernate 在哪里放classname.hbm.xml

java - 具有 Flex、BlazeDS、Apache Tomcat、Java 和 Hibernate 的应用程序

java - 没有 [javax.persistence.EntityManager] 类型的限定 bean

java - 使用级联保存时出现 hibernate 异常 ="save-update"

java - Hibernate/JPA 查询,其中包含列表字段中元素的条件(称为 OneToMany)