0

Glassfish 3.1.2、JPA2.0、eclipselink を使用しています。アプリケーション管理の EntityManager を作成しようとしています。persistence.xml ファイルの持続性ユニットのトランザクション タイプは「JTA」として指定されています。

<persistence-unit name="myPU" transaction-type="JTA">

Bean では、EntityManagerFactory を次のように作成します。

EntityManagerFactory emf = Persistence.createEntityManagerFactory("myPU");

次に、EntityManager を次のように作成します。

EntityManager em = emf.createEntityManager();

問題は、この方法で取得したエンティティ マネージャーは JTA でしょうか? 私はこれを試してみましたが、JTA エンティティ マネージャーに対して許可されるべきではない例外なく、エンティティ マネージャーで getTransaction() メソッドを呼び出すことができました。また、このエンティティ マネージャを Bean 管理のトランザクションで使用すると (エンティティ マネージャはトランザクションの開始後に作成されます)、ユーザー トランザクションのコミット後に DB に永続化されるものは何もありません。

エンティティ マネージャとエンティティ マネージャ ファクトリをインジェクトする必要があることはわかっていますが、この動作を理解したいと思います

persistence.xml は次のようになります。

    <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="myPU" transaction-type="JTA">
        <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
        <jta-data-source>java:app/jdbc/myDatasource</jta-data-source>
        <class>example.MyEntity</class>  
        <properties>
          <property name="eclipselink.ddl-generation.output-mode" value="sql-script"/>
          <property name="eclipselink.application-location" value="C:\gen-ddl"/>      
        </properties>
      </persistence-unit>
    </persistence>

データソースを定義した EAR プロジェクトの glassfish-resource.xml ファイルは次のようになります。

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE resources PUBLIC "-//GlassFish.org//DTD GlassFish Application Server 3.1 Resource Definitions//EN" 
    "http://glassfish.org/dtds/glassfish-resources_1_5.dtd">
    <resources>
        <jdbc-connection-pool  name="MyDB_Pool" datasource-classname="oracle.jdbc.pool.OracleDataSource" res-type="javax.sql.DataSource">
            <property name="url" value="jdbc:oracle:thin:@192.168.xxx.xxx:1521:xxx"/>
            <property name="user" value="xxx"/>
            <property name="password" value="xxx"/>
        </jdbc-connection-pool>

        <jdbc-resource 
            enabled="true" 
            jndi-name="java:app/jdbc/myDatasource" 
            object-type="user" 
            pool-name="MyDB_Pool"/>
    </resources> 
4

1 に答える 1

1

persistence.xml を確認して含めます。JTA DataSource を使用していますか、それとも JDBC 接続を指定していますか?

JTA を使用する場合は、JTA DataSource を使用する必要があります。それ以外の場合は、RESOURCE_LOCAL を使用する必要があります。

JTA トランザクションの開始後に EntityManager を作成すると、自動的にトランザクションに参加するはずです。それ以外の場合は、joinTransaction() を呼び出す必要があります。

于 2013-09-04T13:19:01.640 に答える