如何使用OpenSessionInViewInterceptor?

时间:2015-10-26 06:14:25

标签: spring hibernate spring-mvc lazy-initialization

考虑实体

public class User {
...
@OneToMany(cascade = CascadeType.ALL)
List<SocialCredential> credentialsList = new ArrayList<SocialCredential>  ();
}

使用DAO实现方法

@Transactional
@Override
  public User getUser(long id){
  Session s = sessionFactory.getCurrentSession();
  User u = (User) s.get(User.class, id);
  return u;
}

和控制器

@Controller
      public class DummyController {
       @Autowired
       UserDAO userDAO;

       public void anyMethodAccessedByGetORPost(){
         User u= userDAO.getUser(1L);
       }
      }

实体用户的简单查询会自动触发查询以初始化SocialCredential的实体列表?最终它导致了LazyInitializationException。我开始知道OpenSessionInViewInterceptor可以解决这个问题。我怎么能应用相同的东西。我已经关注http://www.jroller.com/kbaum/entry/orm_lazy_initialization_with_dao但到目前为止没有成功。

1 个答案:

答案 0 :(得分:0)

实体用户的简单查询会自动触发查询以初始化SocialCredential的实体列表?

  
    

这取决于底层持久性API的默认提取类型。     Refer this question

  

最终会导致LazyInitializationException - 这可能是您在会话结束后尝试访问credentialsList集合。

用以下代码替换DAO的getUser(Long id)方法可以解决LazyInitializationException

@Transactional
@Override
public User getUser(long id){
   Session s = sessionFactory.getCurrentSession();
   User u = (User) s.get(User.class, id);
   if (u != null) {
      u.getCredentialsList(); //it loads the SocialCredentials before session closes.
   }
   return u;
}