使用EntityManager merge()方法更新实体时,为什么会得到重复的记录?

时间:2019-01-25 11:28:19

标签: java hibernate jpa

我遇到一个问题,当我更新调用entityManager.persist()之后返回的实体对象时,会在数据库中创建重复记录。

这就是正在发生的事情。我坚持一个实体,并使用相同的对象来应用一些更改。当我运行merge()更新实体时,它会在数据库中产生两条记录。

两条记录的数据几乎相同,但是只有具有较高ID(我使用自动生成的整数作为ID)的记录才具有调用persist()方法后更新的值。

对如何避免这种情况有帮助吗?真正需要做的是用新值更新相同的记录。由于我使用的是JTA数据源,因此无法在em.getTransaction()方法中使用create()。我尝试使用UserTransaction,但在这里也无法使用。

这是我的应用程序中代码的组织方式。

@Entity
@Table(name="table_name")
public class EntityClass{
    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    private int id;

    //more fields

    //getters and setters
} 

@Stateless
@TransactionAttribute(TransactionAttributeType.MANDATORY)
public class ClassA{
    @PersistanceContext
    EntityManager em;

    public <T> T create(T t){
        em.persist(t)
        return t;
    }

    public <T> T update(T t){
        return (T) em.merge(t);
    }
}

@Stateless
public class ClassB{
    @EJB
    ClassA a;

    @TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
    public void createEntity(...){
        EntityClass ec = new EntityClass();

        //more operations where I set ec values

        ec = a.create(ec)

        internalMethod(ec)
    }

    private void internalMethod(EntityClass ec, ...){
        //some more operations altering ec values

        //after this I'm left with two records with different id's and
        //only the record with higher id has the updated data
        a.update(ec);
    }

}

0 个答案:

没有答案