为什么 hibernate 在传递瞬态实体进行合并时运行两个查询?

问题描述 投票:0回答:1

JPA规范规定:如果X是一个新的实体实例,则一个新的 创建托管实体实例 X' 并复制 X 的状态 进入新的托管实体实例 X'。
所以我尝试从下面的两个例子来理解上面的内容:-
案例1:-

        entityManager.getTransaction().begin();
        //let's assume we dont have a employee with id 2 in database
      Employee e=new Employee();
      e.setId(2);
      e.setName("john");
      /*
      If I understand correctly the below query should run just an INSERT query
      when context is flushed
      but hibernate runs two queries,SELECT followed by INSERT
       */
      entityManager.merge(e);
       // entityManager.getTransaction().commit();

案例2:-

  entityManager.getTransaction().begin();
        //let's assume we have a employee with id 3 in database
      Employee e=new Employee();
      e.setId(3);
      e.setName("arthur");
      /*
      If I understand correctly the below query should fail to run because
      then we would have two records with same primary key when context is flushed 
      but hibernate runs two queries,SELECT followed by UPDATE
       */
      entityManager.merge(e);
       // entityManager.getTransaction().commit();

我是休眠新手,所以我对合并的理解是否正确?如果不是,我错过了什么?另外,合并似乎也适用于瞬态实体,对吗?

java hibernate jpa merge transient
1个回答
0
投票

您需要阅读 JPA 规范以了解合并行为 - 但 API 与插入关系不大;您可能对 em.persist(e) 感到困惑?合并采用分离的(或新的实体)并将其合并到上下文中。这需要将其加载到上下文中(如果尚不存在),这会导致选择,然后将实体的更改合并到它将返回的托管实例中。如果不存在,它将在需要时执行插入(刷新/提交等),否则它将在需要时执行更新。

© www.soinside.com 2019 - 2024. All rights reserved.