0

我正在尝试使用 JPA 更新现有记录。以下链接似乎表明更新记录的唯一方法是为其编写更新查询在 此处输入链接描述

这很好。但是再次,我想知道为什么我要把它从存储过程中取出来使用开放 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 设置为等于传入的启动吗?

4

1 回答 1

1

阅读您发布的链接:

您可以通过以下方式之一修改实体实例:

  • 使用更新查询
  • 使用实体的公共 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 的实体,将状态从分离实体复制到附加实体,并返回附加实体:

Foo attachedModifiedFoo = em.merge(detachedFoo);

如果分离的实体不是持久的(即没有任何 ID),那么它会被创建并持久化。

于 2012-04-30T18:21:57.107 回答