对合并行为的澄清

clarification on behaviour of merge

假设我的持久层(即数据库)上有一个 ID 为 1 的对象 A

如果我执行以下操作

A a = new A();
a.setId(1);
a.setSomeField("a value");
A managed_a = entityManager.merge(a);

实体管理器是否会在数据库中检索 ID 为 1 的持久化实体, 对其进行管理,并相应地对其进行更新?

或者 ID 为 1 的对象必须存在于持久性上下文中才能发生上述情况?

The semantics of the merge operation applied to an entity X are as follows:

  • If X is a detached entity, the state of X is copied onto a pre-existing managed entity instance X' of the same identity or a new managed copy X' of X is created.
  • If X is a new entity instance, a new managed entity instance X' is created and the state of X is copied into the new managed entity instance X'.

关于第一点:如果您的实体 A 的 id 为 1 已经存在于您的数据库中 table,那么这意味着实体 A 是一个 DETACHED 实体.在这种情况下,实体 A 的字段将合并到您 table 中的数据,因此您会看到这是一个更新操作。

关于第二点:如果您的数据库中不存在id为1的实体A table,则实体A被视为NEW实体。因此,这将是一个 INSERT 操作。

这两种情况都会导致合并操作返回托管实体。