我对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 时,实体经理认为这是一个新实体并创建一个新行。
如何实现此更新过程?
答案 0 :(得分:1)
一些事情。首先,为什么需要使用merge()是否序列化实例,为什么?如果您只编辑从持久性上下文返回的对象,则无需进行任何合并或保存。
如果您需要将对象编辑为序列化或分离,那么对于新对象,您需要从保存中返回对象的Id,这将是分离对象与托管对象的链接。理想情况下,在编辑对象之前,您将执行find()以获取对象。