我在Glassfish中使用Spring,我需要对它进行配置,因此它也可以在容器外部工作,主要用于开发目的。
我不确定,也找不到答案的是,我是否可以在没有容器的情况下使用LocalContainerEntityManagerFactoryBean
类。
从它的名字LocalContainer
开始,似乎我可以在docs中说:
创建JPA的FactoryBean EntityManagerFactory根据 JPA的标准容器引导程序 合同
所以我不确定这个问题。
谢谢,
以太
答案 0 :(得分:2)
我只想注意Spring支持在容器外部运行JPA,并且不需要任何事务管理器。要问的问题是你是否使用Spring的声明式事务管理(例如,“@ Transaction”)。
如果你是,那么你需要提供“PlatformTransactionManager”的实现。在这里,你不需要在JTA支持上使用完全(在上面的例子中由Atomikos提供。你可以简单地使用JpaTransactionManager实例(它需要引用实体管理器工厂),前提是你没有对“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,它具有“配置文件”以允许您有条件地为每个环境定义bean(例如,“生产”,“开发”或“云”,或任何你想要的东西。)
答案 1 :(得分:0)
是的,这是可能的,但您需要提供一个事务管理器(如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>