@Andrfas

Как работать с транзакциями в hibernate?

Разбираюсь с hibernate и mySQL.
Допустим, в service методе вызывается объект DAO, и на последнем вызывается метод, которым достаётся объект таблицы БД (код упрощённый):
void service() {
   Dao d = new Dao();
   Obj o = d.getObj();
}


Dao class
Obj getObj() {
   sessionFactory = HibernateUtil.getSessionFactory();
   Session session = factory.getCurrentSession();
   ransaction ta = session.beginTransaction();
   //manipulations to get object
   ta.commit();
   session.close();
}


Начитавшись статей в интернете, я понял что я не верно работаю с транзакциями (например при lazy fatching возникают проблемы в методе service).
Так же я увидел @Transactional, и, насколько я понял, эта аннотация должна решить мою проблему (вплоть до того, что мне не нужно будет вообще открывать и закрывать транзакции). Поставил эту аннотацию перед методом service(), но это не сработало (при попытке вытянуть lazy data из объекта - получаю ошибки).

В hibernate.cfg.xml про TransactionManager ничего не писал, т.к. не нашел что нужно прописать.

Направьте меня пожалуйста в нужную сторону - как это всё правильно настроить и как правильно с этим работать?
  • Вопрос задан
  • 2736 просмотров
Решения вопроса 1
@bobzer
Java EE Developer
Вы смешали все в кучу и сами себя запутали. Во-первых, есть Container-Managed Transactions (CMT) и Bean-Managed Transactions (см. гугл). Зачастую, всё, что можно указывать аннотациями (такими, как @Transactional) относится к CMT. При работе с CMT в вашем приложении нет кода работы с сессиями и транзакциями, всё это неявно делает контейнер (например, сервер приложений). Раз у вас есть этот код, значит у вас Bean-Managed Transactions и аннотации просто игнорируются.

Касательно lazy - вопрос вообще отдельный. Обычно проблемы с lazy инициализацией возникают при чтении данных сущности, а не при ее сохранении. Так что приведенный код и "попытке вытянуть lazy data из объекта - получаю ошибки" друг к другу отношения не имеют.

В общем и целом, если хотите нормально разобраться, прервите кодинг и займитесь изучением документации.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы