我正在使用Eclipselink的JPA实现,这就是我实例化持久化上下文的方式:
@PicketLink
@PersistenceContext(unitName = "txPersistUnit.security")
private EntityManager txEmSec;
这是持久性单位定义:
<persistence-unit name="txPersistUnit.security" transaction-type="RESOURCE_LOCAL">
...
<exclude-unlisted-classes>false</exclude-unlisted-classes>
<properties>
<property name="javax.persistence.target-database" value="PostgreSQL"/>
<property name="eclipselink.cache.shared.default" value="true"/>
...
<!-- EclipseLink should create the database schema automatically -->
<property name="eclipselink.ddl-generation" value="create-or-extend-tables"/>
<property name="eclipselink.ddl-generation.output-mode"
value="database"/>
</properties>
</persistence-unit>
所以,您可以看到我将RESOURCE_LOCAL设置为事务类型,但我在部署时遇到此错误:
java.io.IOException: com.sun.enterprise.admin.remote.RemoteFailureException: Error occurred during deployment: Exception while preparing the app : The persistence-context-ref-name [com.txsolutions.manager.PersistenceManager/txEmSec] in module [txAPI] resolves to a persistence unit called [txPersistUnit.security] which is of type RESOURCE_LOCAL. Only persistence units with transaction type JTA can be used as a container managed entity manager. Please verify your application.. Please see server.log for more details.
服务器是Glassfish 4.0.1 问题是当事务类型设置为RESOURCE_LOCAL时,为什么glassfish没有成功部署此应用程序? 我强调我在部署的同一台服务器上的同一个应用程序中有RESOURCE_LOCAL持久性单元。
现在,当我像这样创建实体管理器时:
..declarations omitted..
factory = Persistence.createEntityManagerFactory("txPersistUnit.security");
entityManager = factory.createEntityManager();
即使使用RESOURCE_LOCAL,也可以使用事务类型来创建它。
总而言之,这两种方法之间的区别是什么?
谢谢!
答案 0 :(得分:0)
由于您在符合JEE的Application Server(即Glassfish)中运行代码,因此您的事务类型应为JTA。
<persistence-unit name="txPersistUnit.security" transaction-type="JTA">
RESOURCE_LOCAL通常用于独立Java SE应用程序。
由于您使用的是@PersistenceContext,表示您使用的是容器管理的实体管理器/持久性上下文。由于它是容器管理的,因此需要您将事务类型设置为JTA。
我建议您尝试使用 Application-Managed 持久性上下文。使用@PersistenceUnit注入EntityManagerFactory的实例,然后从工厂创建实体管理器。示例如下。
@PersistenceUnit(unitName="txPersistUnit.security")
EntityManagerFactory emf;
....
// somewhere in your code
EntityManager em = emf.createEntityManager();