何时以及何时不需要手动将更新保存到 JPA 实体



我有一个java.persistence.Entity class,我使用java.persistence.EntityManager.persist实例化并持久化。为了安全起见,我确保它已合并到持久性上下文中,并且我很好。

现在,我知道当我从头开始创建实体时,我需要通过 EntityManager 手动保留它,但是如果我只是将已经存在的记录作为实体检索怎么办?我的测试表明,简单地在该实体上调用 setter 会导致更新进入数据库,但我正在寻找可以依赖的明确内容。因此,任何人都可以阐明或来源何时(可靠地)对附加实体进行更新,以获取写入磁盘。此时,我别无选择,只能在进行更改后手动保留实体,但我宁愿知道何时何地不必这样做。

更新:(感谢优素福)根据下面提到的接受答案,我的问题得到了回答。JPA EntityManager:为什么使用 persist() 而不是 merge()?。

根据该答案,持久化本身除了将实体添加到持久性上下文之外什么都不做。合并会将一个新对象添加到上下文中。这意味着持久性只是作为持久性上下文的一部分的功能,并且由于通过实体管理器获取实体,实体附加到上下文,因此根本不需要调用持久

正如您所说,如果您从头开始创建对象,则需要调用 persist。

如果使用 EntityManager 访问 JPA 实体,则永远不需要调用持久方法,因为当事务结束时(大多数时候是在返回事务方法时),它会自动持久化。如果不想在事务方法返回时自动保留,则必须使用 EntityManager 的分离方法。

此外,这个答案可能会给你更多的信息

在托管实体实例上调用 EntityManager.persist 的用例之一是将临时实例与其关联,并且在刷新之前需要这些实例的 ID。

假设您有以下模型:

@Entity
public class A {
    @ManyToOne(cascade = CascadeType.PERSIST)
    private B b;
    @ManyToOne(cascade = CascadeType.PERSIST)
    private C c;
}

然后,您将ABC的新实例相关联:

A a = entityManager.find(...);
B b = new B();
a.setB(b);
C c = new C();
a.setC(c);

现在,如果您需要 bc 的 id,则需要显式地持久化它们,或者您可以只保留a因为PERSIST操作将是级联的(这特别适用于更大和更复杂的对象图):

entityManager.persist(a);

最新更新