【问题标题】:ResourceLocal to JTAJTA 的本地资源
【发布时间】:2013-03-05 10:19:33
【问题描述】:

我正在开发一个 Web 应用程序,我必须使用我从未使用过的 JTA。我开始使用 EntityManager 但它似乎在这里不起作用。当我使用 EntityManager 时,我收到此消息:

Only persistence units with transaction type JTA can be used as a container managed entity manager.

简而言之,我有这段代码:

@PersistenceContext(unitName = "zJSF2PU")
private EntityManager em;
em.getTransaction().begin();
//some code
em.getTransaction().commit();

如果没有 EntityManager,我该如何做到这一点?

【问题讨论】:

  • 即使对于 CMT,您仍然使用实体管理器。您使用的是什么版本的 JPA?
  • eclipse-link,但我也用过 Hibernate,而且是一样的
  • 不,不是提供商。您使用的是 JPA 1 还是 2?

标签: java ejb persistence entitymanager jta


【解决方案1】:

在您的 ejb 项目 META-INF/persistence.xml 中,您必须具有以下内容:

<?xml version="1.0" encoding="UTF-8"?>
<persistence>
    <persistence-unit name="myPersistenceUnitNamePersonalised" transaction-type="JTA">
        <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
        <jta-data-source>jdbc/MySQL</jta-data-source>
        <properties>
            <property name="eclipselink.ddl-generation" value="drop-and-create-tables" />
            <property name="eclipselink.ddl-generation.output-mode" value="database" />
        <property name="eclipselink.logging.level" value="FINE" />
        </properties>
    </persistence-unit>
</persistence>

而且你必须在你的Application Server(jboss、tomcat、glassfish)中声明这一点

您需要搜索如何在您的Application Server 中添加数据源和持久性单元...

就是这样......他们通过 jndi 交流

【讨论】:

  • 是的,我有这个,但这对我在这里发布的代码没有帮助
  • 或更好,它有什么帮助?
  • 好吧.. 我定义了一个 JTA 事务... 我刚刚告诉你如何添加一个持久性单元,如 zJSF2PU 但 JTA :)
【解决方案2】:
  1. 从您的 persistence.xml 中删除 transaction-type="RESOURCE_LOCAL"

  2. 删除对em.getTransaction() 的调用。注入javax.transaction.UserTransaction (JTA) 并使用它的开始/提交/回滚方法。或者,将 EM 注入到无状态 EJB 中,并允许 EJB 容器自动管理事务。

【讨论】:

  • 你说的我认为都是真的,但我需要知道怎么做,这就是我提交一段代码的原因,所以如果你知道怎么做,你可以帮助我更新的代码?谢谢你的回答。
  • 另一方面,我尝试使用无状态 EJB,但结果是一样的
  • 对不起,这似乎是概念级别而不是代码级别的误解。很高兴你明白了。
【解决方案3】:

我终于能够解决我的问题。例如,从我的搜索结果来看,当您在 ManagedBeans 中使用 JTA 时,您不能使用 EntityManager。但是它可以在无状态 bean 中使用,然后我们可以将此无状态 Bean 注入到 ManagedBean 并使用它的方法。程序如下:

  • 创建一个 EJB(带有@Stateless 注解的简单类)

  • 将使用EntityManager的方法移到EJB

  • 将 EJB 注入您的托管 bean(使用 @EJB 注释)并调用相关方法

有关更多信息,请参阅此其他帖子:JTA & MySQL

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-10-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-12
    • 1970-01-01
    • 2018-03-08
    相关资源
    最近更新 更多