JPA - JTA - две большие проблемы (для .persist () и для .remove ()) - MySQLIntegrityConstraintViolationException - PullRequest
0 голосов
/ 11 февраля 2019

Во-первых, я хотел бы извиниться, если я не смог найти ничего о том, что я хотел бы описать, что действительно решило мои проблемы.Это не значит, что я полностью искал на сайте.Хотя я трачу слишком много времени (дней).Я также новичок здесь (в том смысле, что я никогда не писал / отвечал пользователям 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 ()), у меня возникает проблема с попыткой управлять транзакциями вручную, когда вместо этого яне может .. кажется бесконечным циклом ..

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

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

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

Большое спасибо!

1 Ответ

0 голосов
/ 13 февраля 2019

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

Откат к использованию .persist () (поэтому, отбрасывая createNativeQuery ()), помещая em.flush () ТОЛЬКО ПОСЛЕ em.persist (my_entity_object)Мне помогло то, что после нарушения ограничения уникальности (см. выше), повышенное исключение теперь можно отследить.Теперь я могу поступить, как описано в начале статьи.

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

Спасибо!

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