Grails 休眠会话打开/关闭和延迟初始化



我有很多与会话相关的异常,例如:

org.hibernate.LazyInitializationException failed to lazily initialize a collection of role: <...>, no session or session was closed
org.hibernate.LazyInitializationException: could not initialize proxy - no Session
org.hibernate.HibernateException: Illegal attempt to associate a collection with two open sessions
org.hibernate.NonUniqueObjectException: a different object with the same identifier value was already associated with the session
org.hibernate.TransientObjectException: cannot lock an unsaved transient instance: <...>
org.hibernate.UnresolvableObjectException: No row with the given identifier exists

我试图理解为什么。 所以我激活了 SQL 日志,当我查看休眠统计信息时,我可以看到打开了 80 个会话,关闭了 80 个会话,即使 http 请求没有结束...... 我认为 OSIV(默认情况下在 grails 中激活(可以防止一些懒惰的 init 异常,但据我所知,会话是按需打开然后关闭的(用于交易(。

那么为什么在 http 请求结束之前我没有至少一个会话保持打开状态?

您有任何想法来了解/调查正在发生的事情吗?

多谢

Versions used:
Grails 2.5.6
GORM 3.1.4 
Spring 4.1.9
Hibernate3 3.6.10

似乎您正在尝试访问 grails 控制器/服务之外的实体上的 getter。

如果您已经延迟启动了关系,并且想要访问它,则应使用闭包withTransaction

YourEntityClass.withTransaction{
yourEntityClass.getX()
// more logic
}

其他解决方法包括:

  • 保持你的逻辑Service
  • 使用预先加载

相关内容

  • 没有找到相关文章

最新更新