Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用openJPA更新记录时的最佳实践_Jpa_Entitymanager - Fatal编程技术网

使用openJPA更新记录时的最佳实践

使用openJPA更新记录时的最佳实践,jpa,entitymanager,Jpa,Entitymanager,我想知道使用JPA更新记录的最佳实践是什么?我目前已经设计了自己的模式,但我怀疑这绝不是最佳实践。我所做的基本上是查看记录是否在数据库中,如果找不到它,我将调用enityManager.persist(object)方法。如果它确实存在,我调用entityManager.Merge(Object)方法 我询问的原因是,我发现merge方法查看记录是否在数据库allready中,如果它不在数据库中,则继续添加它,如果是,则进行必要的更改。另外,是否需要将合并调用嵌套在getTransaction(

我想知道使用JPA更新记录的最佳实践是什么?我目前已经设计了自己的模式,但我怀疑这绝不是最佳实践。我所做的基本上是查看记录是否在数据库中,如果找不到它,我将调用
enityManager.persist(object)
方法。如果它确实存在,我调用
entityManager.Merge(Object)
方法

我询问的原因是,我发现merge方法查看记录是否在数据库allready中,如果它不在数据库中,则继续添加它,如果是,则进行必要的更改。另外,是否需要将合并调用嵌套在getTransaction().begin()和getTransaction.commit()中?这是我到目前为止所拥有的

   try{
        launchRet = emf.find(QuickLaunch.class, launch.getQuickLaunchId());
        if(launchRet!=null){
            launchRet = emf.merge(launch);
        }
        else{
            emf.getTransaction().begin();
            emf.persist(launch);
            emf.getTransaction().commit();
        }
    }

如果要保存的实体已具有ID,则该实体必须存在于数据库中。如果它不存在,您可能不想盲目地重新创建它,因为这意味着其他人已经删除了该实体,更新它没有多大意义

merge()。因此,除了调用
merge()
(并将此调用返回的值返回到
merge()
)之外,您不需要执行任何操作


事务是一个功能性的原子工作单元。它应该在更高的级别(在服务层)进行划分。例如,将资金从一个帐户转移到另一个帐户需要在同一笔交易中进行两次帐户更新,以确保两次更改成功或失败。从一个账户中取出资金,而不能将其添加到另一个账户中,这将是一个重大缺陷

所以本质上我应该去掉if-else子句?为什么我要返回值btw?因为merge将分离实体的状态作为参数,并将其复制到另一个附加实例。其余的代码应该使用附加的实例,而不是分离的实例。合并用于这两种情况。但我只想在对象发生更改时更新对象。合并足够聪明吗?还是我需要另一个逻辑?@Kayser测试一下,你就会看到。在我的例子中,我试图更新的记录的
version
列为
null
。当我将
version
列设置为
0
时,记录已成功更新。