2012-03-16 5 views
0

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

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

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

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

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

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

+0

Доступен ли режим GWT dev? –

+0

Я думаю, что я могу использовать кодировку и кодировку. На самом деле это то, о чем я думал. Не могли бы вы предоставить фрагмент кода о том, как вводить с помощью guice в этих случаях, пожалуйста? – HowDoIUnregisterThisAccount

ответ

0

Поскольку вы открыты для использования 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 и webapps с Guice, но я думал, что это может быть точкой отключения для вас. Остальные шаги - это что-то вроде: добавьте фильтр Guice, расширьте GuiceServletContextListener, добавьте инжектор JPA к этому, добавьте ваш слушатель в web.xml.

Удачи!

+0

Привет, exabrial. Спасибо за ваш ответ. Я использовал инъекцию губ, как описано здесь: http://www.benmccann.com/dev-blog/hibernate-with-jpa-annotations-and-guice/. Он отлично работает в модульных тестах. Я не уверен, как условно внедрить EntityManager с узором, когда я запускаю Jetty и позволяю Resin вводить в производство. Если я правильно понял, вы предлагаете использовать присутствие зрителя-получателя в web.xml, чтобы сделать это условно. – HowDoIUnregisterThisAccount