0

我对 JPA 处理添加/更新实体的方式有点困惑。

ATM,我有这段代码:

AltContact c = new AltContact("test");
save(c)
System.out.println("ENTITY: " + contains(c));
c.setEnterpriseName("test2");
save(c);
System.out.println("ENTITY: " + contains(c));

save方法是我的应用程序服务器端的一个简单方法,它请求在 EntityManager 上进行合并:

public void save (Object e) {
    em.merge(e);
    em.flush();
}

其中emEntityManager.

contains再次是服务器端的一种方法,它将询问实体管理器是否存在于当前持久上下文中的给定实体。

上面的代码在我的表中创建了两行,第一行的值为“test”,另一行的值为“test2”,这不是我想要的。

我想创建一个值为“test”的新行,然后在创建该行之后立即更新它并将其值设置为“test2”。我在两次调用save后打印出了contains的返回,被返回了两次。false

我猜问题来自这样一个事实,即我的实体在第一次调用save后不是持久上下文的一部分,所以当我再次调用save时,实体管理器认为它是一个新实体并创建一个新行。

怎样才能实现这个更新过程呢?

4

1 回答 1

1

一些东西。首先,为什么需要使用 merge() 来序列化实例,为什么?如果您只是编辑从持久性上下文返回的对象,那么您不需要进行任何合并或保存。

If you need to edit the object as serialized, or detached, then for a new object you need to return the Id of the object from your save, this is what will link the detached object with the managed one. Ideally you would execute a find() to get the object before you edit it.

于 2012-11-05T14:59:40.260 回答