JPA - JTA - две большие проблемы (для.persist() и.remove()) - MySQLIntegrityConstraintViolationException

Во-первых, я хотел бы извиниться, если я не смог найти ничего о том, что я хотел бы описать, что действительно решило мои проблемы. Это не значит, что я полностью искал на сайте. Хотя я трачу слишком много времени (дней). Я также новичок здесь (в том смысле, что я никогда не писал / отвечал пользователям SO). И я прошу прощения за мои возможные ошибки на английском языке.

Я должен сказать, что я новичок в Java EE. Я работаю над WildFly 14, используя MySQL. Сейчас я сосредоточен на проблеме JPA. У меня есть ограничение уникальности. Я делаю тесты и при выполнении теста на нарушение уникальности с уровня источника данных я получаю исключение MySQLIntegrityConstraintViolationException, и это нормально. У меня проблема в том, что метод persist () не позволяет мне перехватить исключение (я даже поместил Throwable в предложении, но ничего..). Я строго, строго, должен это уловить, чтобы управлять важной процедурой (которая косвенно содержит вызов.remove()) в коде моей работы.

Кстати, пытаясь написать это исключение, система не показывает мне окно предлагаемых классов / аннотаций / и т. Д., Предлагая мне просто создать класс "MySQLIntegrityConstraintViolationException". Разве работы с WildFly, использующей MySQL, недостаточно для получения предложений?

Не найдя решения, я решил изменить: вместо использования persist () я решил использовать.createNativeQuery(), в котором в качестве параметра я поместил строку, описывающую вставку в БД. Кажется, работает. Действительно, это работает (сигнализирует о нарушении уникальности (хорошо!), Не выполняет код блока TRY (хорошо!) И переходит в блок CATCH (хорошо!)). Но, опять же, исключение / ошибка не ясна. Кроме того, когда в коде я ввожу фрагмент кода, который отвечает за управление перехватом, а затем выполняет то, что внутри (и у меня есть.remove (), внутри), это вызывает исключение:

"Для выполнения этой операции требуется транзакция (либо использовать транзакцию, либо расширенный контекст постоянства)" -> это относится к моему выполнению entityManager.remove().

Теперь я не могу понять... не должны ли JPA/JTA автоматически управлять транзакциями?

Более того, пытаясь позже поместить entityManager.getTransaction(). Begin () (и commit ()), у меня возникает проблема с попыткой управлять транзакциями вручную, когда вместо этого я не могу.. кажется бесконечным циклом..

[edit]: я работаю в контексте CMT, поэтому мне разрешено работать только с EntityManager и EntityManagerFactory. Я пытался с entityManager.getTransaction(). Begin () и entityManager.getTransaction(). Commit (), и это не сработало.

[edit ']:.getTransaction (объект EntityTransaction) нельзя использовать в контексте CMT, по этой причине это не сработало.

[edit '']: я решил проблему транзакции с помощью управления транзакциями, подходящего для контекста CMT: JTA + CMT требует, чтобы мы управляли транзакциями с помощью блока TRY-CATCH-FINALLY, в теле которого TRY он необходим чтобы поместить операцию, которую мы хотим выполнить, в базу данных и в конечное тело которой необходимо поместить объект EntityManager, закрывающий (em.close ()). Хотя, как объяснено выше, я использовал em.createNativeQuery(), который при сбое генерирует перехватываемые (перехватываемые в моем приложении) исключения; Мне действительно нужно сделать откат (использование.createNativeQuery() является временным) в моем рабочем коде и использовать метод.persist (), поэтому мне нужно знать, что делать, чтобы можно было перехватить это MySQLIntegrityConstraintViolationException,

Спасибо!

1 ответ

ЭТО ВИДЕТЬ, я решил проблему.

Откат к использованию.persist () (то есть отказ от createNativeQuery()), установка em.flush() JUST AFTER em.persist(my_entity_object) помог мне в том, что после нарушения ограничения уникальности (см. Выше) Возникшее исключение теперь можно отловить. Теперь я могу поступить так, как описано в начале поста.

ВНИМАНИЕ: Я напоминаю вам о том, что я новичок в JavaEE-JPA-JTA. Мне повезло, потому что, поскольку у меня не было знаний, я применил эту инструкцию (em.flush ()), сделав предположение (я не знаю, как я мог об этом думать). Следовательно, я не смог бы объяснить поведение; Я был бы признателен, однако, за любое объяснение того, что могло бы произойти, как и когда используется метод flush (), и так далее, и так далее...

Спасибо!

Другие вопросы по тегам