Spring 如何使用OpenSessionInviewWinterCeptor?
考虑实体Spring 如何使用OpenSessionInviewWinterCeptor?,spring,hibernate,spring-mvc,lazy-initialization,Spring,Hibernate,Spring Mvc,Lazy Initialization,考虑实体 public class User { ... @OneToMany(cascade = CascadeType.ALL) List<SocialCredential> credentialsList = new ArrayList<SocialCredential> (); } 和控制器 @Controller public class DummyController { @Autowired UserDAO use
public class User {
...
@OneToMany(cascade = CascadeType.ALL)
List<SocialCredential> credentialsList = new ArrayList<SocialCredential> ();
}
和控制器
@Controller
public class DummyController {
@Autowired
UserDAO userDAO;
public void anyMethodAccessedByGetORPost(){
User u= userDAO.getUser(1L);
}
}
实体用户的简单查询会自动触发查询以初始化SocialCredential?的实体列表?最终,它导致了LazyInitializationException。我开始了解OpenSessionInViewInterceptor,它可以解决这个问题。我如何应用它。我已经在跟踪,但到目前为止没有成功 实体用户的简单查询自动触发查询以初始化SocialCredential的实体列表 它取决于底层持久性API的默认获取类型。 最终导致LazyInitializationException——这可能是您在会话关闭后尝试访问
CredentialList
集合
用下面的代码替换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;
}
谢谢你,但这并不是我问题的答案。这是一种恶意加载分离实体的方法,可以使用FetchType.EAGER轻松完成。正如我的问题所述,我对实现OpenSessionInviewWinterCeptor感兴趣。
@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;
}