对合并行为的澄清
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 操作。
这两种情况都会导致合并操作返回托管实体。
假设我的持久层(即数据库)上有一个 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 操作。
这两种情况都会导致合并操作返回托管实体。