【问题标题】:JPA; Setting 'transaction-type' on annotationJPA;在注释上设置“事务类型”
【发布时间】: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 不消耗这个持久性单元呢?无论如何,问题已编辑...

标签: java jpa eclipselink glassfish-4 transactional


【解决方案1】:

由于您在 JEE 兼容的应用服务器(即 Glassfish)中运行代码,因此您的事务类型应该是 JTA。

<persistence-unit name="txPersistUnit.security" transaction-type="JTA">

RESOURCE_LOCAL 通常用于独立 Java SE 应用程序。

由于您使用的是@PersistenceContext,这意味着您使用的是Container-Managed 实体管理器/持久性上下文。由于它是容器管理的,因此需要您将事务类型设置为 JTA。

我建议您尝试使用 Application-Managed 持久性上下文。使用@PersistenceUnit 注入EntityManagerFactory 的实例,然后从工厂创建实体管理器。下面的例子。

@PersistenceUnit(unitName="txPersistUnit.security")
EntityManagerFactory emf;

....
// somewhere in your code
EntityManager em = emf.createEntityManager();

【讨论】:

  • 但这不是强制性的,是吗?我希望你会同意,因为我声明了 RESOURCE_LOCAL 持久性单元并在同一服务器上的同一应用程序中运行。
  • 您的异常消息指出“只有具有事务类型 JTA 的持久性单元才能用作容器管理实体管理器。”这一事实意味着您应该将其设置为 JTA。
  • 在理想情况下,我会将它设置为 JTA,如果它部署它就完成了!但它不会,我也不会谈论这个,因为这个线程是关于别的东西的。所以,请要么回答我的问题,要么不要将注意力转移到其他方向。谢谢
  • 我更新了我的答案,希望能帮助您解决问题。
猜你喜欢
  • 2011-04-12
  • 2012-07-28
  • 2019-11-02
  • 1970-01-01
  • 2019-01-26
  • 2011-03-21
  • 2011-04-22
  • 2011-10-28
  • 1970-01-01
相关资源
最近更新 更多