【发布时间】:2014-06-25 07:21:01
【问题描述】:
我知道在 http 会话中存储对象是个坏主意,因为当我尝试访问该对象的集合类型属性时,OSIV 无法解决导致的 LazyInitializationException。
不幸的是,我一直在 http 会话中存储一些对象,例如 currentUser:
我将当前用户存储在 http 会话中,例如:
session.currentUser = loggedUser
一个用户有一个类似的规则集合
session.currentUser.rules
正如预期的那样,当我尝试在后续请求中访问规则集合时,我得到一个 LazyInitializationException 异常,因为 session.currentUser 失去了它的持久性上下文。
即使我正在迁移到在 http 会话中存储对象 id 的正确方法,我也必须找到一种解决方案,以确保对存储在 http 会话中的对象的集合属性的访问不' t 导致 LazyInitializationException。
我正在考虑通过重写 HttpSession 的方法来解决:
HttpSession.metaClass.getProperty { name ->
if(name.equals("currentUser")){
def userId = delegate.getProperty(name).id
def userInstance = Utilisateur.get(userId)
println 'in metaclass currentUser ' + userInstance.isAttached()
return userInstance
}else{
return delegate.getProperty(name)
}
}
我没有直接返回 currentUser,而是使用 Get() 方法从休眠会话中检索附加对象。
这个解决方案似乎有效, 你认为这是个好主意吗?
【问题讨论】: