gpt4 book ai didi

JPA 实体管理器 : Why use persist() over merge()?

转载 作者:行者123 更新时间:2023-12-03 03:45:48 27 4
gpt4 key购买 nike

EntityManager.merge()可以插入新对象并更新现有对象。

为什么要使用 persist() (它只能创建新对象)?

最佳答案

无论哪种方式都会将实体添加到 PersistenceContext,区别在于您随后对实体执行的操作。

Persist 获取一个实体实例,将其添加到上下文中并管理该实例(即,将跟踪该实体的 future 更新)。

合并返回与状态合并的托管实例。它确实返回 PersistenceContext 中存在的内容或创建实体的新实例。在任何情况下,它都会从提供的实体复制状态,并返回托管副本。您传入的实例将不会被管理(您所做的任何更改都不会成为事务的一部分 - 除非您再次调用合并)。尽管您可以使用返回的实例(托管实例)。

也许代码示例会有所帮助。

MyEntity e = new MyEntity();

// scenario 1
// tran starts
em.persist(e);
e.setSomeField(someValue);
// tran ends, and the row for someField is updated in the database

// scenario 2
// tran starts
e = new MyEntity();
em.merge(e);
e.setSomeField(anotherValue);
// tran ends but the row for someField is not updated in the database
// (you made the changes *after* merging)

// scenario 3
// tran starts
e = new MyEntity();
MyEntity e2 = em.merge(e);
e2.setSomeField(anotherValue);
// tran ends and the row for someField is updated
// (the changes were made to e2, not e)

场景 1 和 3 大致相同,但在某些情况下您需要使用场景 2。

关于JPA 实体管理器 : Why use persist() over merge()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1069992/

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