質問

私はEJB 3とJPAを初めて使用しています。

AppServerでDataSourceを作成しました jdbc/AppDataSource. 。デフォルトの永続プロバイダーは、として残されています com.ibm.websphere.persistence.PersistenceProviderImpl。そして、私はデフォルトのJTAデータソースJNDI名をとして残しました AppDataSource 自体。私は実際にJTAと非JTAに関して混乱しています。何がそれらを区別しますか?

エンティティを生成して作成しました EntityTransaction 豆のオブジェクト。電話すると persist()commit() 方法、エラーが発生します:

javax.ejb.EJBException: See nested exception; nested exception is: <openjpa-1.2.1-SNAPSHOT-r422266:686069 fatal user error> org.apache.openjpa.persistence.ArgumentException: A JDBC Driver or DataSource class name must be specified in the ConnectionDriverName property.
Caused by: <openjpa-1.2.1-SNAPSHOT-r422266:686069 fatal user error> org.apache.openjpa.persistence.ArgumentException: A JDBC Driver or DataSource class name must be specified in the ConnectionDriverName property.

OpenJPAはここでどのように写真に登場しますか?

今のところ、私の persistence.xml エンティティクラス名のみが含まれます。

データソースのデフォルトのAppServer値を使用するにはどうすればよいですか。または、JPAプロバイダーの詳細とDataSourceの詳細をどのように提供できますか persistence.xml?

入力を提供してください。

役に立ちましたか?

解決

この質問には実際には多くの概念が含まれており、私はそれらすべてを詳細にカバーしません。より徹底的な詳細については、全体を読むことをお勧めします 第5章 - エンティティマネージャーと永続性コンテキスト JPA 1.0仕様(およびこの回答の最後に記載されている他の関連セクション)。むしろ、Java EE環境で最も一般的なシナリオを説明しようとします。

EJB環境内では、通常、以下を使用します。

  • a コンテナ管理エンティティマネージャー (JTAエンティティマネージャーである必要があります)
    • トランザクションスコープ ステートレスセッションでビーンズ(SLSB)
    • 拡張 ステートフルセッションでビーンズ(SFSB)
  • JTAトランザクション管理(そしてそうではありません リソースローカルトランザクション これがない限り 本当 あなたが欲しいもの)

これが方法です persistence.xml JNDI名でデータソースを使用するJTAエンティティマネージャーの場合 java:comp/env/jdbc/AppDataSource WebSphereが使用するPersistenceプロバイダーであるOpenJPAは、セットアップできます。

<?xml version="1.0" encoding="UTF-8"?>
<persistence 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"
  version="1.0">
  <persistence-unit name="MyPu" transaction-type="JTA">
    <provider>org.apache.openjpa.persistence.PersistenceProviderImpl</provider>
    <jta-data-source>java:comp/env/jdbc/AppDataSource</jta-data-source>
    <class>com.acme.domain.Foo</class>
    <class>com.acme.domain.Bar</class>
    <exclude-unlisted-classes>true</exclude-unlisted-classes>
    <properties>
      <!-- OpenJPA specific properties -->
      <property name="openjpa.TransactionMode" value="managed"/>
      <property name="openjpa.ConnectionFactoryMode" value="managed"/>
      <property name="openjpa.jdbc.DBDictionary" value="db2"/>
    </properties>
  </persistence-unit>
</persistence>

OpenJPAプロパティについては、OpenJPAを参照してください ドキュメンテーション.

また、SLSB(コンテナマネージドトランザクションを使用)がコンテナ管理エンティティマネージャーを注入する方法を次に示します。

@Stateless
public class EmployeeServiceBean implements EmployeeService {
    @PersistenceContext(unitName="MyPu")
    private EntityManager em;

    public Employee createEmployee(int id, String name, long salary) {
        Employee emp = new Employee(id);
        emp.setName(name);
        emp.setSalary(salary);
        em.persist(emp);
        return emp;
    }
    ...    
}

そして、それだけです。エンティティマネージャーのライフサイクルは、アプリケーションのためにコンテナが透過的に管理され(Createem/closeなし)、エンティティマネージャーはコンテナによって管理されるJTAトランザクションに参加します(明示的な開始/コミットはありません)。

以前に暗示されていたように、私は表面をひっかいているだけです。私の目標は、どういうわけかあなたを正しい道に置くことです。さらに進むには、本をつかむことをお勧めします(例:EJB3の行動)。一方、以下の参考文献は良い読書になるでしょう。

参照

  • JPA 1.0仕様
    • セクション5.2.1「Java EE環境でエンティティマネージャーの取得」
    • セクション5.5「トランザクションの制御」
    • セクション5.6「コンテナ管理された永続性コンテキスト」
    • セクション6.2.1.2「トランザクションタイプ」
    • セクション6.2.1.4「プロバイダー」
    • セクション6.2.1.5「JTA-Data-Source、非JTA-Data-Source」

資力

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top