OpenEjb 4.5.0 と MySQL 5.5.xx を InnoDB エンジンで使用しています。
EntityManagerFactory が注入された、非常に単純なステートレス Bean があります。
@PersistenceUnit
private EntityManagerFactory factory
以下のような取引を行っています。
EntityManager em = factory.createEntityManager();
EntityTransaction tx = em.getTransaction();
try {
tx.begin();
Query query = em.createNativeQuery("INSERT IGNORE INTO `myTable` (myColumn) values (1)");
query.executeUpdate();
tx.commit();
} catch (RuntimeException re) {
if (tx.isActive())
tx.rollback();
} finally {
em.close();
}
次の構成では:
persistence.xml :
<persistence version="1.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_1_0.xsd">
<persistence-unit name="ejbPU-ro" transaction-type="RESOURCE_LOCAL">
<provider>org.apache.openjpa.persistence.PersistenceProviderImpl</provider>
<non-jta-data-source>mySQLDataSource</non-jta-data-source>
<exclude-unlisted-classes>false</exclude-unlisted-classes>
<properties>
<property name="openjpa.jdbc.SynchronizeMappings" value="buildSchema(foreignKeys=true"/>
<property name="openjpa.jdbc.SchemaFactory" value="native(foreignKeys=true)"/>
<property name="openjpa.Log" value="DefaultLevel=TRACE,SQL=TRACE"/>
</properties>
</persistence-unit>
</persistence>
openejb.xml (データソース定義のみ):
<Resource id="mySQLDataSource" type="DataSource">
JdbcDriver com.mysql.jdbc.Driver
JdbcUrl jdbc:mysql://127.0.0.1:3307/myDb?relaxAutoCommit=true
UserName root
Password
</Resource>
私の小さなプログラムを実行すると、次の例外が発生
org.apache.openjpa.persistence.RollbackException: Commit can not be set while enrolled in a transaction
しManagedConnection.commit
ます。transactionContext != null
指示/ヒントをいただければ幸いです。
ありがとう、
アビラム