我正在使用spring 3.2 spring security和hibernate 3.4.0。
当我的用户登录时,我将用户存储在我的自定义主体中。
稍后在应用程序中,我想访问与我的用户关联的集合。 所以我这样做:
User u = ((MyCustomPrincipal) SecurityContextHolder.getContext().getAuthentication().getPrincipal()).getUser();
u.getMyCollection();
我当然得到一个LazyInitException。 所以我的临时解决方案是再次获取用户:
User u = ((MyCustomPrincipal) SecurityContextHolder.getContext().getAuthentication().getPrincipal()).getUser();
u = userDao.find(u.getId());
u.getMyCollection();
通过这样做它可以工作,但我觉得它不是一个非常优化的解决方案,因为我的用户ows 4集合,所以我将被迫在不同的地方多次从db中取出我的用户(在我的自定义验证器中,在拦截器,在我的控制器......)。
是否有解决此问题的方法,如全局交易或其他什么?
感谢
答案 0 :(得分:1)
您可以尝试将分离的用户合并到当前会话:
User u = ((MyCustomPrincipal) SecurityContextHolder.getContext().getAuthentication().getPrincipal()).getUser();
u = userDao.merge(u);
u.getMyCollection();
http://docs.jboss.org/hibernate/entitymanager/3.4/reference/en/html/objectstate.html#d0e891
答案 1 :(得分:0)
当我的用户登录时,我将用户存储在我的自定义主体
中
在您的登录代码中,您首次从userDao获取用户,只需添加user.getMyCollection()
电话即可。这将获取关联的集合并将其存储在用户对象中。当您稍后通过SecurityContextHolder
访问它时,LazyIntializationException
将不会被抛出。