【发布时间】:2016-01-06 14:30:38
【问题描述】:
我正在使用 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 作为事务类型,它也会成功创建。
那么这两种方法有什么区别呢?
谢谢!
【问题讨论】:
-
你忘了问问题。
-
所以错误消息几乎可以告诉您到底出了什么问题。想象一下,当您收到一条消息不太清晰的错误时。
-
对不起,我认为这很明显.. 那么为什么 glassfish 不消耗这个持久性单元呢?无论如何,问题已编辑...
-
最佳描述 IMO:tomee.apache.org/jpa-concepts.html
标签: java jpa eclipselink glassfish-4 transactional