为什么在FlushModeType.COMMIT中的em.persist之后进行INSERT?

jFr*_*tic 5 hibernate jpa-2.0

我已FlushModeTypeCOMMIT,但em.persist()调用之后,插入件到数据库进行.我希望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);

}
Run Code Online (Sandbox Code Playgroud)

我希望,在setProp2()调用之后,实际的INSERT将在方法结束时生成.但是Hibernate在调用后立即执行插入操作em.persist().

有人能解释一下这种行为吗?

编辑:
我甚至使用FlushMode.MANUAL对Hibernate试图会话,但它执行INSERTem.persist反正.那么,有没有办法手动控制何时完成冲洗

Edit2:
这是我面临的问题.我有一个实体,A具有-一个实体B.B在调用期间,实体尚不存在em.persist(a),并且我在数据库中有一个'CONSTRAINT CHECK(B IS NOT NULL).我发现的唯一解决方法是在Oracle中使用延迟约束.但是,此解决方案是特定于供应商的,并不能真正满足我.

Edit3:
Cascade似乎是一个很好的解决方案,但在我们的项目中,我们不允许使用它.我们鼓励手动控制所有插入和更新.

Shi*_*gon 3

FlushMode Commit 不保证提交会在事务提交时发生。这更多的是对提供者(规范的实现者,比如这里的 Hibernate)的提示,但他可以随时选择这样做。如果您想保留/更新一个具有数据库中尚不存在的新依赖项的 bean。在持久化/合并操作上使用级联来持久化它。如果您将字段/依赖项声明为不可为空,那么 JPA 不会让您保存该字段/依赖项为空的实体,这是正常的,因为它会强制执行您对其施加的约束。您想要做的几乎是围绕 JPA 规范的黑客/解决方法。如果实际上有时可以为空,则可以将该字段/依赖项设置为空,或者在保留父项时确保它永远不会为空(如果它是新值,则级联)。