gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 12:29:58 26 4
gpt4 key购买 nike

我已将 FlushModeType 设置为 提交 ,但是在 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 ,但它执行 插入 之后 em.persist反正。那么,有没有办法手动控制flush何时完成?

编辑 2:
这是我面临的问题。我有一个实体 A which has-a entity B .实体 B在调用 em.persist(a) 期间还不存在,并且我在数据库中有一个“约束检查(B 不是 NULL)”。我发现的唯一解决方法是在 Oracle 中使用延迟约束。但是,此解决方案是特定于供应商的,并不能真正让我满意。

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

最佳答案

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

关于hibernate - 为什么在 FlushModeType.COMMIT 的 em.persist 之后进行 INSERT?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7819128/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com