5

EJB 3 と JPA は初めてです。

アプリサーバーにデータソースを作成しましたjdbc/AppDataSource. デフォルトの持続性プロバイダーはそのままcom.ibm.websphere.persistence.PersistenceProviderImplです。また、デフォルトの jta データ ソース JNDI 名はAppDataSourceそのままにしました。私は実際にJTAと非JTAに関して混乱しています。それらを区別するものは何ですか?

エンティティを生成EntityTransactionし、Bean にオブジェクトを作成しました。persist()andメソッドを呼び出すと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はどのように見えてくるのでしょうか?

現在、 mypersistence.xmlにはエンティティ クラス名のみが含まれています。

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

入力してください。

4

1 に答える 1

6

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

EJB 環境では、通常、次のものを使用します。

  • コンテナ管理のエンティティ マネージャ( JTA エンティティ マネージャである必要があります)
    • ステートレス セッション Bean (SLSB) でのトランザクション スコープ
    • ステートフル セッション Bean (SFSB) で拡張
  • JTA トランザクション管理 (これが本当に必要な場合を除き、リソース ローカル トランザクションではありません)

persistence.xmlJNDI 名を持つデータ ソースを使用する JTA エンティティ マネージャーを設定する方法を次に示しますjava:comp/env/jdbc/AppDataSource。OpenJPA は、WebSphere で使用される持続性プロバイダーです。

<?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 in Action など) を読むことをお勧めします。一方、以下の参考文献は良い読み物です。

参考文献

  • 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、non-jta-data-source」

資力

于 2010-08-20T08:19:49.090 に答える