当前位置: 首页 > 知识库问答 >
问题:

JPA OneToo级联合并和持久化之间的一个区别

闻人宝
2023-03-14

我有以下问题。我有3个实体,我使用的是一个单向实体:

@Entity
public class Entity1 implements Serializable{

   @Id
   @GeneratedValue(strategy= GenerationType.AUTO)
   Long id;
   String name;
   String value;
}
@Entity
public class Entity2 implements Serializable {
  @Id
  @GeneratedValue(strategy=GenerationType.AUTO)
  private Long id;

  @OneToOne(cascade={CascadeType.MERGE, CascadeType.PERSIST})
  Entity1 entity1;
  public Entity1 getEntity1() {
      return entity1;
  }

  String name;
  String value;
}
@Entity
public class Entity3 implements Serializable {
  @Id
  @GeneratedValue(strategy=GenerationType.AUTO)
  Long id;

  @OneToOne(cascade={CascadeType.MERGE, CascadeType.PERSIST})
  private Entity1 entity1;

  public Entity1 getEntity1() {
      return entity1;
  }

  public void setEntity1(Entity1 entity1) {
      this.entity1 = entity1;
  }

  String name;
  String value;
}

一个小测试

public void testApp()
   {
    EntityManager em = TestHibernateUtil.getEntityManager();
    em.getTransaction().begin();
    Entity1 entity1 = new Entity1();
    entity1.name = "Name1";
    entity1.value = "Value1";

    Entity2 entity2 = new Entity2();
    entity2.name = "Name2";
    entity2.value = "Value2";
    entity2.setEntity1(entity1);
    **em.merge(entity2);**// if change that to persist - I get one Entity1

    Entity3 entity3 = new Entity3();
    entity3.name = "Name3";
    entity3.value = "Value3";
    entity3.setEntity1(entity1);
    **em.merge(entity3);** // if change that to persist - I get one Entity1
    em.getTransaction().commit();
 }

因此,看看上面的测试,如果我使用em.merge,在事务提交之后,确实会在持久性上下文中获得Entity1的两个实体,如果我将其更改为em.persist,则会在持久性上下文中获得Entity1的一个实体。有谁能解释一下为什么会发生这种情况或者指出一些文档吗?

共有1个答案

经博延
2023-03-14

我不想挑战DannyMo的uber答案,但我想做一个补充:

Persist和merge被设计为保留某个对象的一个托管实例的方法。

如果使用persist,则表示该对象还不存在,因此使其成为唯一的托管实例并没有坏处。

如果对object的过时版本使用merge,将其作为参数传递给上一个merge,则jpa不知道如何找到正确的对象,因为它还没有ID。假设它是一个新对象,并且将创建新的托管实例。

我真是个新手。如果我哪里错了,请指正。

 类似资料:
  • 主要内容:JPA级联持久化示例,输出结果级联持久化用于指定如果实体持久化,则其所有关联的子实体也将被持久化。 以下语法用于执行级联持久性操作 - JPA级联持久化示例 在这个例子中,我们将创建两个相互关联的实体类,但要建立它们之间的依赖关系,我们将执行级联操作。 这个例子包含以下步骤 - 第1步: 在包下创建一个名为的实体类,其中包含属性:,,以及标记为级联规范的类型的对象。 文件: StudentEntity.java - 第2步:

  • Hy全部 我很难解决次年Spring的jpa问题。假设我有以下简单的数据模型(两个实体之间有单向关系) 和下面的管道来存储它们 下面的测试 最后一次测试(即insertEntity2WithExistingEntity1)失败,出现以下异常 组织。冬眠PersistentObjectException:传递给persist:com的分离实体。实例杰帕德莫。实体1 如果我将Entity2中的Casc

  • 我可以通过以下方法将数据发送到Firebase FiRecovery文档: 1) 添加() 2) set() 我很清楚,如何将数据添加到Firestore中,其中没有任何混淆。但我的问题是,Firebase Firestore中的方法“set”有两个setOption,例如merge和mergefields。这两组选项之间的区别是什么,我认为这两个选项的作用是相同的。如何实现setOption“m

  • 我与以下实体类有一个双向的一对多关系: 当然,所有必需的级联选项都是在客户端设置的。但如果在引用现有产品订单时首次持久化新创建的客户端(如本场景所示),则它将不起作用: 已创建并持久化产品订单“%1”。工作正常。 已创建客户端“%2”,并将产品订单“%1”添加到其产品订单列表中。然后它被持久化。不起作用。 我尝试了几个apporach,但没有一个显示出预期的结果。请参阅下面的结果。我在这里阅读了所

  • 问题内容: 我在带有MySQL 5.0 DB的WebSphere Application Server 8上使用OpenJPA 2.2.0。 我有一个要合并到数据库中的对象列表。 就像是: 当我运行此循环时,我需要大约300-600毫秒来合并一个对象。当我删除“ em.merge(ob);”行时 那么我需要“ 0”毫秒来遍历1个列表对象。 所以我的问题是:我该怎么做才能缩短合并一个对象的时间? 谢

  • 我在我的一个实体中有一个如下所示的映射。在尝试保存该实体时,如果已经设置了scrMSgLine id并且级联类型是PERSIST,那么我得到了“org.hibernate.persistentObjectException:detached entity pass to PERSIST:scrMSgLine”异常。如果我将级联类型更改为合并,则记录保存成功。 如果scrMSgLine id为nul