2012-06-06 3 views
9

Я получаю эту ошибку:Не удается использовать EntityTransaction при использовании JTA

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

Хотя если это попробуйте использовать UserRepository из простого приложения Java, он работает правильно.

Спасибо заранее,

ответ

8

Как говорится об ошибках, если вы используете JTA для транзакций, необходимо использовать JTA.

Либо использовать JTA UserTransaction для начала/фиксации транзакции или использования единицы сохранения RESOURCE_LOCAL и не-jta DataSource.

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

+2

Большое спасибо, это смущает, но я считал, что часть кода работает. Благодаря, – andreaxi

14

Вы не должны использовать em.getTransaction().begin(); ни em.getTransaction().commit();, эти инструкции должны быть использованы с RESOURCE_LOCAL типа сделки.

В вашем случае транзакция управляется контейнером при первом использовании метода EntitiyManager в вашем методе, контейнер проверяет, есть ли активная транзакция или нет, если нет активной транзакции, то она создает один, и когда вызов метода завершается, транзакция фиксируется контейнером. Так, в конце ваш метод должен выглядеть следующим образом:

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

Контейнер заботится о сделке, то есть JTA.

Смежные вопросы