使用 openJPA 持久化更新查询

Posted

技术标签:

【中文标题】使用 openJPA 持久化更新查询【英文标题】:persisting an update query using openJPA 【发布时间】:2012-04-30 18:13:08 【问题描述】:

我正在尝试使用 JPA 更新现有记录。以下链接似乎表明更新记录的唯一方法是为其编写更新查询 enter link description here

这很好。但是再次,我想知道为什么我要把它从存储过程中取出来使用开放 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】:

阅读您发布的链接:

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

使用更新查询 使用实体的公共 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),则创建它并使其持久。

【讨论】:

那很好,但是我已经有一个 someExistingFoo 并且我想坚持它是什么?例如,有人通过 FooId 搜索 someExistingFoo,如果找到,我是否应该将其设置为等于已经传入的 someExistingFoo 对象?我将发布一个示例来解释我在说什么。 啊哈哈...资本好先生。我记得在某处的 entityManager.Merge(Object obj) 上读过一些东西,我想我没有建立联系。感谢您的提醒!

以上是关于使用 openJPA 持久化更新查询的主要内容,如果未能解决你的问题,请参考以下文章

jpa实例

我应该使用哪个 EJB 3 持久提供程序?

JavaEE Tutorials (10) - Java持久化查询语言

EJB_开发单表映射的实体bean

Hibernate学习第一课

JPA合并与持久化[重复]