Я установил FlushModeType на COMMIT , но сразу после em.persist () вызов INSERT выполняется в базу данных. Я ожидаю, что Hibernate будет записывать изменения в базу данных только в конце транзакции, но похоже, что это работает иначе.
Небольшой код для иллюстрации проблемы:
@Entity
@Table(name="tbl1")
@Inheritance(strategy=InheritanceType.JOINED)
public class TopLevelEntity {}
@Entity
@Table(name="tbl2")
public class MyEntity extends TopLevelEntity {
AnotherEntity anotherEntity;
//getters and setters
}
@Entity
@Inheritance(strategy=InheritanceType.SINGLE_TABLE)
public class AnotherEntity { }
public void someTransaction() {
em.setFlushMode(FlushModeType.COMMIT);
MyEntity e = new MyEntity();
em.persist(e);
e.setProp1(someVal1);
e.setProp2(someVal2);
}
Здесь я ожидаю, что фактическая INSERT будет выполнена в конце метода, сразу после вызова setProp2 ().
Но Hibernate выполняет вставку сразу после вызова em.persist ()
.
Может кто-нибудь объяснить мне такое поведение?
Изменить:
Я даже пробовал использовать FlushMode.MANUAL для Hibernate Session , но он выполняет INSERT после em .persist
в любом случае. Итак, нет ли возможности вручную контролировать выполнение flush ?
Edit2:
Вот проблема, с которой я столкнулся. У меня есть объект A
, у которого есть объект B
. Сущность B
еще не существует во время вызова em.persist (a)
, и у меня есть «ПРОВЕРКА ОГРАНИЧЕНИЙ (B IS NOT NULL) в базе данных». Единственный обходной путь, который я нашел, - использовать отложенное ограничение в Oracle. Однако это решение зависит от производителя и меня не устраивает.
Edit3:
Cascade кажется хорошим решением, но в нашем проекте нам не разрешено его использовать. Нам рекомендуется вручную контролировать все вставки и обновления.