JPA JTA — использование EntityManager.persist() и EntityManager.remove() в одном и том же объекте объекта (один и тот же атрибут идентификатора объекта)

У меня есть два метода, один из которых хранит объект сущности (объектный компонент EntityClass1), используя .persist(), передающий идентификатор EntityClass1, а другой отвечает за удаление объекта сущности с тем же идентификатором.

У меня есть конфигурация, в которой я вызываю в третьем методе (в другом классе) оба:

1) метод выше, который выполняет .persist() и

2) метод, который выполняет .remove() (таким образом, действуя на тот же объект сущности - тот же идентификатор), после выполнения некоторого кода, если что-то пойдет не так.

Первая операция проходит правильно (я продолжаю). В случае выполнения метода, который выполняет удаление одного и того же объекта сущности из базы данных, когда я получаю доступ к удаляемому объекту с помощью EntityManager.find(), этот последний метод возвращает NULL. КАК ЭТО ВОЗМОЖНО?? Я уверен, что сохранил этот объект.

Я уверен, что использовал необходимое для управления транзакциями (в контексте CMT): в каждом из двух методов я создаю объект EntityManager из аннотированного (@PersistenceUnit) EntityManagerFactory, управляя механизмом транзакций с TRY-CATCH контекста CMT. -FINALLY блок, в теле которого FINALLY я закрываю объект EntityManager (в теле TRY которого я выполняю .persist() и .remove() соответственно для двух вышеперечисленных методов).

Таким образом, в моем методе удаления я не могу получить объект для удаления, даже если он только что был сохранен с помощью моего метода вставки. В чем может быть проблема?

Может ли быть какая-то причина, из-за которой этот объект был удален?

Я новичок в JavaEE-JPA-JTA. Большое спасибо.

[EDIT]: я исправил некоторые из этих проблем. Тот em.find(), который ранее возвращал null, ТЕПЕРЬ ВОЗВРАЩАЕТ МОЙ РАЗЫСКИВАЕМЫЙ ОБЪЕКТ. Я только что изменил свой код, чтобы использовать единственный менеджер объектов (комментарии @Jaspreet заставили меня заметить это), и мне пришлось изменить управление транзакциями CMT (не нужно было использовать этот блок TRY-CATCH-FINALLY). Вы можете увидеть JPA - странное поведение при использовании метода EntityManager remove(). Хотя в этом новом обсуждении я разместил новые вопросы.


person tcoddis    schedule 13.02.2019    source источник
comment
Я думаю, проблема в том, что вы пытаетесь создать 2 разных контекста диспетчера сущностей, пока вы выполняете сохранение в одной транзакции, которая будет завершена, когда будет завершен ваш третий метод. После этого только второй метод найдет эту запись в базе данных, а затем только вы сможете удалить его. Вместо этого попробуйте иметь единый менеджер объектов.   -  person Jaspreet Jolly    schedule 13.02.2019
comment
Джасприт, я собираюсь сделать это немедленно, спасибо   -  person tcoddis    schedule 13.02.2019
comment
я получаю: IllegalStateException: WFLYJPA0017: диспетчер объектов, управляемых контейнером, может быть закрыт только контейнером (автоматически очищается в конце tx/вызова и закрывается при закрытии компонента-владельца.)... относится к моей инструкции em.close(); в НАКОНЕЦ теле   -  person tcoddis    schedule 13.02.2019
comment
Привет, jaspreet, после некоторых правок в коде я понял, что это последнее исключение больше не возникает, но я заметил, что даже при наличии одного менеджера сущностей метод em.find() в моем методе, который выполняет remove(), все еще продолжается. вернуть ноль. Кто-нибудь еще знает о моей проблеме? Благодарность   -  person tcoddis    schedule 13.02.2019
comment
Привет, кое-что исправил! Выше я разместил свою новую дискуссию, в которой у меня другие проблемы. Благодарю вас!   -  person tcoddis    schedule 21.02.2019