JPA EclipseLink添加/更新实体

时间:2012-11-05 10:24:52

标签: java jpa entitymanager

我对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();
}

其中 em EntityManager的实例。

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

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

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

我想这个问题来自于我的实体在第一次调用 save 之后不属于持久性上下文的事实,所以当我再次调用 save 时,实体经理认为这是一个新实体并创建一个新行。

如何实现此更新过程?

1 个答案:

答案 0 :(得分:1)

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

如果您需要将对象编辑为序列化或分离,那么对于新对象,您需要从保存中返回对象的Id,这将是分离对象与托管对象的链接。理想情况下,在编辑对象之前,您将执行find()以获取对象。

相关问题