Как создать JPA EntityManagerFactory, который работает в контейнерах и автономных приложениях?

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

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

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

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

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

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

1 ответ

Поскольку вы открыты для использования 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.

Удачи!

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