Можно ли использовать LocalContainerEntityManagerFactoryBean от Spring в среде J2SE?

#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>