私はこのエラーを受け取っています:
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を使用しようとすると、正しく動作します。
よろしくお願いいたします。AN
エラーが示すように、トランザクションにJTAを使用している場合は、JTAを使用する必要があります。
JTA UserTransactionを使用してトランザクションを開始またはコミットするか、RESOURCE_LOCAL永続性ユニットと非jta DataSourceを使用します。
参照 http://en.wikibooks.org/wiki/Java_Persistence/Transactions
em.getTransaction().begin();
やem.getTransaction().commit();
を使用することはできません。これらの命令はRESOURCE_LOCAL
トランザクションタイプ。
あなたの場合、トランザクションはコンテナによって管理されます。メソッドでEntitiyManager
を初めて使用するときに、コンテナはアクティブなトランザクションがあるかどうかをチェックします。アクティブなトランザクションがない場合は、トランザクションを作成します。また、メソッド呼び出しが終了すると、トランザクションはコンテナによってコミットされます。したがって、最後にメソッドは次のようになります。
public void save(User user) {
em.persist(user);
}
コンテナはトランザクション、つまりJTAを処理します。