Почему INSERT выполняется после em.persist в FlushModeType.COMMIT?

Я установил 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 кажется хорошим решением, но в нашем проекте нам не разрешено его использовать. Нам рекомендуется вручную контролировать все вставки и обновления.

5
задан jFrenetic 23 October 2011 в 11:27
поделиться