Я установил 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()
.
Может кто-нибудь объяснить мне это поведение?
Edit:
Я даже пытался использовать FlushMode.MANUAL для Hibernate Session , но он все равно выполняет INSERT после em.persist
. Итак, нет ли способа ручного управления, когда flush сделано?
Edit2:
Вот проблема, с которой я сталкиваюсь. У меня есть сущность A
, которая имеет сущность B
. Субъект B
еще не существует во время вызова em.persist(a)
, и у меня есть «КОНТРАМЕНТНАЯ ПРОВЕРКА (B НЕ НЕДЕЙСТВИТЕЛЕН) в базе данных». Единственный обходной путь, который я нашел, - это использовать отложенное ограничение в Oracle. Тем не менее, это решение зависит от производителя и не очень меня устраивает.
Edit3:
Каскад кажется хорошим решением, но в нашем проекте нам не разрешено его использовать. Мы рекомендуем вручную контролировать все вставки и обновления.