使用openJPA更新记录时的最佳做法

时间:2012-05-01 11:57:07

标签: jpa entitymanager

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

我问的原因是,我发现merge方法看看记录是否已经在数据库中,并且如果它不在db中,那么它会继续添加它,如果它是,它使必要的变化。此外,您是否需要在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();
        }
    }

1 个答案:

答案 0 :(得分:4)

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

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

交易是一个功能性的原子工作单位。它应该在更高级别(在服务层中)划分。例如,将资金从帐户转移到另一个帐户需要在同一事务中完成帐户更新,以确保两个更改都成功或失败。从一个帐户中删除资金并且无法将其添加到另一个帐户将是一个主要错误。