3

我想知道使用 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();
        }
    }
4

1 回答 1

4

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

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

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

于 2012-05-01T12:05:50.847 回答