gpt4 book ai didi

JPA OneToOne 级联合并和持久化的区别

转载 作者:行者123 更新时间:2023-12-03 11:36:56 27 4
gpt4 key购买 nike

我有以下问题。我有 3 个实体,我正在使用 OneToOne 单向:

实体 1

@Entity
public class Entity1 implements Serializable{

@Id
@GeneratedValue(strategy= GenerationType.AUTO)
Long id;
String name;
String value;
}

实体 2
@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;
}

实体3
@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事务提交后,如果我将其更改为 em.persist,我确实在持久性上下文中获得了 Entity1 的 2 个实体然后我在持久性上下文中得到 Entity1 的一个实体。任何人都可以解释我为什么会发生这种情况或指向一些文档吗?

最佳答案

我不会梦想挑战 DannyMo 的 super 答案,但我想补充一点:

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

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

使用合并时,您会考虑对象的托管实例可能已经存在。您不想替换那个唯一的托管实例,因为其他一些对象可能会引用它,认为它是托管对象。

如果要在合并后对对象进行操作,正确的合并如下所示:
managedObject = em.merge(object); // or just object = em.merge(object)
//You cannot do it with persist since it returns null

如果您尝试检查是否 managedObjectobject指向同一个对象实例检查if(managedObject == object)你会得到 false(当你对已经管理的对象使用合并并且操作被忽略时,true 是可能的)。

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

我是个菜鸟。如果我在任何地方错了,请纠正我。

关于JPA OneToOne 级联合并和持久化的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18373383/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com