有没有解决方案来避免LazyInitializationException

时间:2013-12-11 11:34:20

标签: spring hibernate lazy-loading

我正在使用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中取出我的用户(在我的自定义验证器中,在拦截器,在我的控制器......)。

是否有解决此问题的方法,如全局交易或其他什么?

感谢

2 个答案:

答案 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将不会被抛出。