Как создать JPA EntityManagerFactory, который работает в контейнерах и автономных приложениях? - PullRequest
0 голосов
/ 16 марта 2012

Я новичок в JPA, поэтому после некоторого поиска и попыток я не смог понять, как сделать следующее.

Я хочу использовать аннотированные классы JPA в модульных тестах, на производстве - на сервере приложений для смолы.и в режиме разработки для GWT (jetty).

Проблема заключается в том, что я мог использовать Persistence.createEntityManagerFactory вместе с META-INF / persistence.xml в модульных тестах, и он работает нормально.Тем не менее, он не работает на смоле, и я получаю ту же ошибку в режиме разработки GWT.

Я мог бы заставить его работать на смоле с помощью аннотации @Inject и смолы-web.xml, но не уверен, как ее использоватьв режиме разработки GWT.

Я хотел бы использовать один и тот же код, если это возможно, для всех трех случаев: модульных тестов, Jetty для GWT и смолы в производстве.Я также хотел бы позволить смоле обрабатывать пулы соединений и по возможности избегать использования Spring.

Существуют ли какие-либо учебные пособия, которые охватывают этот конкретный случай или примеры кода?Каковы лучшие практики?

1 Ответ

0 голосов
/ 16 марта 2012

Поскольку вы открыты для использования Guice, Guice может использовать существующие аннотации @Inject.

Итак, идея заключается в том, чтобы делать то же, что и Resin, когда запускает ваш код.Resin распознает аннотацию @Inject, находит соответствующий класс и создает экземпляры, а затем вводит это значение.Мы можем заставить Guice сделать то же самое для нас для вашего юнит-теста и режимов GWT.

Самое большое изменение - вам придется создать отдельный профиль для вашего файла persistence.xml.Скопируйте существующий файл и измените имя.Например, если существующим PU является «myJPAUnit», в новом файле назовите его «myJPAUnitLocal» следующим образом:

 <persistence-unit name="myJPAUnitLocal" transaction-type="RESOURCE_LOCAL">
 </persistence-unit>

Другое ключевое изменение - изменить transaction-type на RESOURCE_LOCAL, как вприведенный выше пример, потому что ваши транзакции не управляются контейнером.

Я не буду рассматривать предварительные требования, потому что в Google есть много хороших руководств по запуску тестов Junit и веб-приложений с Guice, ноЯ думал, что это может быть отправной точкой для вас.Остальные шаги выглядят примерно так: добавьте фильтр Guice, расширьте GuiceServletContextListener, добавьте к нему инжектор JPA, добавьте слушателя в файл web.xml.

Удачи!

...