考虑实体
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但到目前为止没有成功。
答案 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;
}