JPA;设置'交易类型'关于注释

时间:2015-10-08 19:49:09

标签: java jpa eclipselink glassfish-4 transactional

我正在使用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,也可以使用事务类型来创建它。

总而言之,这两种方法之间的区别是什么?

谢谢!

1 个答案:

答案 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();