IBM WebSphere JPA構成-Persistence.xmlを更新する方法
質問
私は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」