2012-06-06 30 views
9

Tôi nhận được lỗi này:Không thể sử dụng một EntityTransaction khi sử dụng JTA

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

Trong khi cố gắng sử dụng JPA và JavaEE, Glassfish.

tập tin persistence.xml của tôi là như sau:

<?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> 

gì tôi đang cố gắng làm là để tồn tại một đối tượng (Thành viên), theo cách này:

@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(); 
    } 
} 

Trong khi nếu nó cố gắng sử dụng UserRepository từ một ứng dụng Java đơn giản, nó hoạt động chính xác.

Cảm ơn trước, AN

Trả lời

8

Theo các tiểu bang lỗi, nếu bạn đang sử dụng JTA cho các giao dịch, bạn cần phải sử dụng JTA.

Hoặc sử dụng JTA UserTransaction để bắt đầu/cam kết giao dịch hoặc sử dụng đơn vị lưu giữ RESOURCE_LOCAL và DataSource không phải jta.

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

+2

Cảm ơn rất nhiều, thật đáng xấu hổ nhưng tôi cho rằng một phần của mã hoạt động. Cảm ơn, – andreaxi

14

Bạn đang không được phép sử dụng em.getTransaction().begin(); cũng không em.getTransaction().commit();, những hướng dẫn này sẽ được sử dụng với RESOURCE_LOCAL loại giao dịch.

Trong trường hợp giao dịch được quản lý bởi vùng chứa, trong lần sử dụng đầu tiên của EntitiyManager trong phương thức của bạn, vùng chứa sẽ kiểm tra xem có giao dịch đang hoạt động hay không, nếu không có giao dịch nào được kích hoạt. khi cuộc gọi phương thức kết thúc, giao dịch được thực hiện bởi vùng chứa. Vì vậy, vào cuối phương thức của bạn sẽ trông giống như sau:

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

Container chứa giao dịch, đó là JTA.

Các vấn đề liên quan