У меня есть приложение, которое я сейчас пишу, которое будет использовать Spring и Hibernate. На своем уровне услуг я ввел DAO, который будет выполнять некоторые базовые действия по CRUD-обработке. Для ухмылки я создал метод, аннотированный следующим образом:
@Transactional(readOnly = false, propogation=Propogation.REQUIRES_NEW)
public void doSomeWork(Dao dao, Entity e){
//do some searching
dao.persist(e);
dao.findAll(Entity.clz);
}
Метод dao persist выглядит следующим образом:
public void persist(Entity e){
session.saveOrUpdate(e); //This has already been built using a SessionFactory
}
Метод dao findAll выглядит следующим образом
public void findAll(Class clz) {
session.createCriteria(clz).list();
}
Теперь, кажется, все работает, хорошо. После того, как я вставил (сохранил) свой объект, я могу увидеть его с помощью метода findAll (вместе с новым идентификатором первичного ключа, который был назначен хранилищем данных), однако, когда метод doSomeWork завершается, мои данные фактически не сохраняются в базовом хранилище данных (Oracle 10g).
Однако, если я удаляю аннотации @Transactional и использую Hibernate для session.getTransaction (). Begin () и session.getTransaction (). Commit () (или отката), код работает так, как я ожидал.
Итак, мой основной вопрос был бы: не использует ли Hibernate управление транзакциями в Spring для фактического управления транзакциями?
В моем файле конфигурации bean-компонента я объявляю bean-компонент TransactionManager, компонент SessionFactory и также включаю его в файл конфигурации.
Чего мне, возможно, не хватало, кроме лучшего знания о Spring и Hibernate?