У меня есть спящий 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();
спасибо за вашу помощь в объяснении этого мне.