Почему я получаю повторяющиеся записи, когда сущность обновляется с помощью метода EntityManager merge ()? - PullRequest
0 голосов
/ 25 января 2019

У меня проблема с тем, что в базе данных создается повторяющаяся запись, когда я обновляю объект сущности, возвращенный после вызова 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);
    }

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...