У меня проблема с тем, что в базе данных создается повторяющаяся запись, когда я обновляю объект сущности, возвращенный после вызова entityManager.persist()
.
. Это то, что происходит.Я сохраняю сущность и использую тот же объект, чтобы применить некоторые изменения.Когда я запускаю merge()
для обновления сущности, это приводит к двум записям в базе данных.
Обе записи имеют почти идентичные данные, но только запись с более высоким идентификатором (я использую автоматически сгенерированное целое число в качестве идентификатора) обновляет значения после вызова метода persist()
.
Любая помощьо том, как этого избежать?Что действительно нужно сделать, это обновить ту же запись новыми значениями.Я не могу использовать em.getTransaction()
в методе create()
, так как я использую источник данных JTA.Я пытался использовать 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);
}
}