1

我正在开发一个 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,我怎么能做到这一点?

4

3 回答 3

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 交流

于 2013-03-16T19:52:55.763 回答
1
  1. transaction-type="RESOURCE_LOCAL"从您的 persistence.xml 中删除。

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

于 2013-03-16T20:10:30.383 回答
1

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

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

  • 将使用 EntityManager 的方法移动到 EJB

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

有关更多信息,请参阅另一篇文章:JTA & MySQL

于 2013-03-17T09:01:20.370 回答