我遇到一个问题,当我更新调用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);
}
}