У меня возникла проблема с откатом транзакций в Spring + Hibernate + SQLite.Слишком сложная транзакция Spring + Hibernate + SQLite
Вот основные классы моего примера
- Аннотация Application Confighttp://pastebin.com/XbejGHft
- TestBeanhttp://pastebin.com/3BSFy34p
- Заказать объект - POJO с двумя полями (идентификатор и имя)
Смотрит на метод TestBean.testMethod()
public void testMethod() {
entityManager.persist(createOrder("1"));
entityManager.persist(createOrder("2"));
entityManager.persist(createOrder("3"));
entityManager.createQuery("from Order").getResultList();
entityManager.persist(createOrder("4"));
throw new RuntimeException("Managed");
}
Он создает и сохраняется ряд объектов Order. Между некоторыми творениями он считывает некоторые данные из базы данных. В конце он бросает RuntimeException для имитации сбоя во время вызова метода и принудительной транзакции Spring.
После выполнения я открываю базу данных и вижу, что она завершена откат только последней созданной сущности (createOrder («4»)) и все остальные (с именами «1», «2» и «3»), все еще присутствующие в базы данных. Но так как TestBean отмечен как @Transactional, тогда он должен удалить все четыре объекта, созданные в одном транзакционном методе testMethod().
Я пробовал все journal_mode в SQLIte, но rollback все еще не работал.
Любые идеи?
Кажется, что Hibernate вызывает ** JdbcIsolationDelegate # delegateWork ** для каждого ** вызова em.persist() **. В то же время метод ** JdbcIsolationDelegate # delegateWork ** вызывает ** Connection # commit **, который блокирует все транзакционное взаимодействие в рамках JPA/Hibernate – Joltd