Основной выпуск
На скриншоте Lib видно, что у вас очень "смешанная" комбинация библиотек. Здесь кроется проблема! Вы не можете смешивать разные уровни API JPA. Вы смешали очень старую / раннюю версию 1.x с самым последним вариантом JPA 2.2 .
Вы помещаете persistence-api-1.0.2.jar
и javax.persistence-api-2.2.jar
в каталог lib в WEB-INF
проекта. Это вызывает конфликты во время выполнения.
Таким образом:
- Удалите устаревшую
persistence-api-1.0.2.jar
из папки и проверьте, разрешает ли это обнаруженное исключение. Если возникают другие исключения, во время выполнения возникает больше несоответствий с вашей настройкой.
Другие комментарии и изменения
Вы неправильно используете концепцию обработки транзакций в классе testing
в методе createPlaces()
. Ваш код:
em.persist();
em.getTransaction().begin();
em.getTransaction().commit();
, который помещает вызов persist()
вне контролируемой транзакции, которую вы открываете после этой линии. Вместо того, чтобы продолжать, как указано выше, вам лучше переформулировать эти строки, как показано ниже. Фрагмент перемещает операцию persist
в пределах транзакции:
EntityTransaction tx = null;
try {
tx = em.getTransaction();
tx.begin();
// Only within a tx to prevent inconsistent states in the DB if sth fails here!
em.persist();
tx.commit();
} catch(RuntimeException) {
if(if(tx != null && tx.isActive()) {
tx.rollback();
}
}
Для получения более подробной информации, проверьте еще один ответ по обработке транзакций Я однажды написал. Это относится к JPA 2.2 и дает вам дополнительную глубину по этой теме.
Надеюсь, это поможет.