使用openJPA持久化更新查询

时间:2012-04-30 18:13:08

标签: persistence jpa-2.0

我正在尝试使用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设置为等于传入的启动?

1 个答案:

答案 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),那么它就会被创建并保持持久性。