使用 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 持久化更新查询的主要内容,如果未能解决你的问题,请参考以下文章