Как создать 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.
- Как инициализировать Guice в веб-приложении: http://code.google.com/p/google-guice/wiki/ServletModule
- Как добавить инжектор JPA в Guice: http://code.google.com/p/google-guice/wiki/JPA
Удачи!