【问题标题】:Cannot use an EntityTransaction while using JTA使用 JTA 时无法使用 EntityTransaction
【发布时间】:2012-06-10 13:34:28
【问题描述】:

我收到此错误:

javax.servlet.ServletException: java.lang.IllegalStateException: 
Exception Description: Cannot use an EntityTransaction while using JTA.

在尝试使用 JPA 和 JAVAEE 时,Glassfish。

我的 persistence.xml 文件如下:

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd">
    <persistence-unit name="acmeauction">
        <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
        <jta-data-source>jdbc/MySQLJDBCResource</jta-data-source>
        <class>it.uniroma3.acme.auction.model.User</class>
        <class>it.uniroma3.acme.auction.model.Auction</class>
        <properties>
            <property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver"/>
            <property name="javax.persistence.jdbc.url" value="jdbc:mysql://localhost:3306/acmeauction"/>
            <property name="javax.persistence.jdbc.user" value="user"/>
            <property name="javax.persistence.jdbc.password" value="password"/>
        </properties>
    </persistence-unit>
</persistence>

我要做的是以这种方式持久化一个对象(用户):

@ManagedBean
public class UserRepository implements Serializable{

    @PersistenceUnit
    EntityManagerFactory emf;

    @PersistenceContext
    private EntityManager em; 

    private static UserRepository instance; 

    /**
     * Gives back the singleton UserRepository singleton. 
     */
    public static UserRepository getInstance() {
        if (instance==null) {
            instance = new UserRepository(); 
        }
        return instance; 
    }

    private UserRepository() {
        emf = Persistence.createEntityManagerFactory("acmeauction");
        em = emf.createEntityManager();             
    }

    /** 
     * Save and persist a new User. 
     */
    public void save(User user) {
        em.getTransaction().begin(); 
        em.persist(user);
        em.getTransaction().commit(); 
    }
}

如果它尝试从一个简单的 Java 应用程序中使用 UserRepository,它可以正常工作。

提前致谢, 安

【问题讨论】:

    标签: jpa glassfish eclipselink jta


    【解决方案1】:

    您不应该使用em.getTransaction().begin();em.getTransaction().commit();,这些说明将与RESOURCE_LOCAL 事务类型一起使用。

    在您的情况下,事务由容器管理,在您的方法中第一次使用 EntitiyManager 时,容器检查是否存在活动事务,如果没有活动事务则创建一个,当方法调用结束时,事务由容器提交。所以,最后你的方法应该是这样的:

    public void save(User user) {
        em.persist(user);
    }
    

    容器负责事务,即 JTA。

    【讨论】:

      【解决方案2】:

      如错误所述,如果您使用 JTA 进行交易,则需要使用 JTA。

      要么使用 JTA UserTransaction 开始/提交事务,要么使用 RESOURCE_LOCAL 持久性单元和非 jta 数据源。

      看, http://en.wikibooks.org/wiki/Java_Persistence/Transactions

      【讨论】:

      • 非常感谢,这很尴尬,但我认为这部分代码有效。谢谢,
      猜你喜欢
      • 2020-11-22
      • 1970-01-01
      • 1970-01-01
      • 2015-05-12
      • 2014-09-07
      • 2014-07-01
      • 2016-07-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多