澄清合并行为

时间:2015-11-05 19:35:28

标签: java database jpa hibernate-entitymanager

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

如果我执行以下操作

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

实体管理器是否会在DB上检索ID为1的持久化实体, 让它管理,并相应地更新它?

或者id为1的对象必须按顺序存在于持久化上下文中才能发生上述情况?

1 个答案:

答案 0 :(得分:0)

  

应用于实体X的合并操作的语义为   如下:

     
      
  • 如果X是分离的实体,则将X的状态复制到预先存在的管理实体实例X'相同的身份或新的托管副本X'创建了X.
  •   
  • 如果X是新的实体实例,则新的管理实体实例X'已创建,并且X的状态将复制到新的管理实体实例X'。
  •   

关于第一点:如果您的数据库表中已存在ID为1的实体A,那么这意味着实体A是 DETACHED 实体。在这种情况下,实体A的字段将合并到表中的数据,因此您将此视为UPDATE操作。

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

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