我正在尝试使用JPA更新现有记录。以下链接似乎表明更新记录的唯一方法是为其编写更新查询 enter link description here
哪个好。但同样,我想知道为什么我将这个从存储过程中拉出来使用所有f开放JPA的魔力? 我想如果我有一个JPA对象的实例,如果我试图使用类似于此的调用持久化到数据库
emf.persist(launchRet)
JPA框架将检查记录是否已经存在,如果是,它将继续对该记录进行更改,如果不存在,则只会添加新记录。哪个真的很酷。相反,我将不得不最终在更新查询中编写所有逻辑。这很好,但为什么我不能只使用存储过程并只传递所有必要的值?
更新:代码解释我最后的评论是什么
try{
launchRet = emf.find(QuickLaunch.class, launch.getQuickLaunchId());
if(launchRet==null){
emf.getTransaction().begin();
emf.persist(launchRet);
emf.getTransaction().commit();
}
else{
emf.refresh(launchRet);
}
}
变量launch将传递给方法...
public QuickLaunch UpdateQuickLaunchComponent(QuickLaunch launch)
我是否可以简单地将找到的启动launchRet设置为等于传入的启动?
答案 0 :(得分:1)
阅读您发布的链接:
您可以通过以下方式修改实体实例:
- 使用更新查询
- 使用Entity的公共API [...]
99%的案例中使用的方式是第二种方式:
Foo someExistingFoo = em.find(Foo.class, someExistingFooId);
someExistingFoo.setSomeValue(theNewValue);
// no need to call any persist method: the EM will flush the new state
// of the entity to the database when needed
当然,也可以通过查询或通过实体图表导航来加载实体。
如果您有一个分离的实体,并且希望将其状态保留到数据库,请使用EntityManager.merge()
方法。它找到与作为参数传递的分离的ID具有相同ID的实体,将状态从分离的实体复制到附加的实体,并返回附加的实体:
Foo attachedModifiedFoo = em.merge(detachedFoo);
如果分离的实体不是持久的(即没有任何ID),那么它就会被创建并保持持久性。