#java #spring #jpa #development-environment
#java #spring #jpa #среда разработки
Вопрос:
Я использую Spring в Glassfish, и мне нужно настроить его так, чтобы он также работал вне контейнера, в основном для целей разработки.
В чем я не уверен и на что не смог найти ответ, так это в том, могу ли я использовать LocalContainerEntityManagerFactoryBean
класс без контейнера.
Судя по его названию, LocalContainer
кажется, что я могу, но в документах говорится:
FactoryBean, который создает JPA EntityManagerFactory в соответствии со стандартным контрактом начальной загрузки JPA для контейнера
итак, я не уверен в этой проблеме.
Спасибо,
Ittai
Ответ №1:
Я просто хотел отметить, что Spring поддерживает запуск JPA-файлов вне контейнера и не требует ничего в виде диспетчера транзакций. Вопрос, который следует задать, заключается в том, используете ли вы декларативное управление транзакциями Spring (например, «@Transactional»).
Если да, то тогда вам необходимо предоставить реализацию «PlatformTransactionManager». Здесь все еще нет необходимости использовать полную поддержку JTA (как предусмотрено Atomikos в приведенном выше примере. Вы можете просто использовать экземпляр JpaTransactionManager (который ожидает ссылку на фабрику entity manager) при условии, что вы ничего не делаете с «XA» и т.д. Если вы используете XA, то Atomikos, или Bitronix, или любой из ряда других вариантов вполне подойдут. Вы могли бы взглянуть на этот пример http://blog.springsource.com/2011/08/15/configuring-spring-and-jta-without-full-java-ee / который демонстрирует, как использовать JTA (например, с JPA и JMS).
Итак, повторяю, если вы просто выполняете простой JPA (подключение к одной базе данных), то вам не нужен JTA, и вам определенно не нужен GlassFish. Если вам нужен XA, вы все равно можете использовать стороннего поставщика JTA, как предложено выше, и вам по-прежнему не нужна Glassfish.
Наконец, если вы действительно хотите поддерживать как GlassFish JTA, так и отдельный JPA, который работает только локально для быстрой разработки в более быстром контейнере, вы могли бы рассмотреть надвигающийся Spring 3.1, в котором есть «профили», позволяющие вам условно определять компоненты для каждой среды (например, «production», или «dev», или «cloud», или что угодно по вашему желанию.)
Ответ №2:
Да, это возможно, но вам нужно предоставить диспетчер транзакций (например, Atomikos). Остальная конфигурация такая же. Это пример:
<bean id="userTransactionService" class="com.atomikos.icatch.config.UserTransactionServiceImp"
init-method="init" destroy-method="shutdownForce">
</bean>
<bean id="AtomikosTransactionManager" class="com.atomikos.icatch.jta.UserTransactionManager"
init-method="init" destroy-method="close" depends-on="userTransactionService">
<property name="forceShutdown" value="true" />
</bean>
<bean id="AtomikosUserTransaction" class="com.atomikos.icatch.jta.UserTransactionImp"
depends-on="userTransactionService">
<property name="transactionTimeout" value="300" />
</bean>
<bean id="transactionManager" class="org.springframework.transaction.jta.JtaTransactionManager"
depends-on="userTransactionService">
<property name="transactionManager" ref="AtomikosTransactionManager" />
<property name="userTransaction" ref="AtomikosUserTransaction" />
</bean>
<bean id="entityManagerFactory"
class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
....
</bean>