我有一个休眠 DAO,它在尝试访问作为包/集合的返回对象的成员时抛出“无法延迟初始化角色集合”异常。
我了解引发异常的问题的范围。Hibernate 返回我的对象,对于任何集合,返回代理对象。在我的调用者中,当我去访问那些代理对象时,因为休眠会话已经过期,所以抛出了这个异常。
我想知道的是,如何使用注释来防止会话过期?是否可以?
例如,如果我的调用方法是:
@RequestMapping("refresh.url")
public ModelAndView refresh(HttpServletRequest request, HttpServletResponse response, int id) throws Exception {
TestObject myObj = testObjDao.get(id);
// throws the exception
myObj.getCollection();
我将如何使用注释来防止这种异常?我知道一种解决方案是通过回调扩展休眠会话,在伪代码中可能类似于:
@RequestMapping("refresh.url")
public ModelAndView refresh(HttpServletRequest request, HttpServletResponse response, int id) throws Exception {
session = get hibernate session...
session.doInSession(new SessionCallback() {
TestObject myObj = testObjDao.get(id);
// no longer throws the exception
myObj.getCollection();
});
但这在我所有需要访问集合的函数中似乎相当重复。有没有办法简单地在上面打一个@Transactional注释并完成它?如:
@RequestMapping("refresh.url")
@Transactional // this doesn't extend the session to this method?
public ModelAndView refresh(HttpServletRequest request, HttpServletResponse response, int id) throws Exception {
TestObject myObj = testObjDao.get(id);
// throws the exception
myObj.getCollection();
感谢您帮助向我解释这一点。