我有很多与会话相关的异常,例如:
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
- 使用预先加载