【问题标题】:best practice when updating records using openJPA使用 openJPA 更新记录时的最佳实践
【发布时间】:2012-05-01 11:57:06
【问题描述】:

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

我问的原因是,我发现合并方法查看记录是否已经在数据库中,如果它不在数据库中,那么它继续添加它,如果是,它使更改成为必要。此外,您是否需要将合并调用嵌套在 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();
        }
    }

【问题讨论】:

    标签: jpa entitymanager


    【解决方案1】:

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

    merge() 方法持久化尚未持久化的实体(没有 ID 或版本),如果实体持久,则更新该实体。因此,除了调用merge()(并将此调用返回的值返回给merge())之外,您无需执行任何操作。

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

    【讨论】:

    • 所以基本上我应该摆脱我拥有的 if-else 子句?为什么我要返回值 btw?
    • 因为 merge 从它作为参数的分离实体中获取状态,并将其复制到另一个附加的实例。其余代码应使用附加实例而不是分离实例。
    • 据我所知,您的回答。合并用于这两种情况。但我只想在对象发生更改时更新对象。合并足够聪明吗?还是我需要其他逻辑?
    • @Kayser 测试一下,你会看到的。
    • 就我而言,我尝试更新的记录的version 列是null。当我将version列设置为0时,记录更新成功。
    猜你喜欢
    • 2010-10-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-30
    • 1970-01-01
    • 2016-08-19
    • 1970-01-01
    相关资源
    最近更新 更多