Seasar DI Container with AOP

このドキュメントはS2Hibernate-JPAのバージョン1.0.0-beta-1のものです。

概要

S2Hibernate-JPAは以下の特徴を持っています。

  • Seasar2で管理されているJava Transaction API (JTA)やConnectionPoolとHibernate3 + Hibernate Annotations + Hibernate EntityManagerが簡単に連動するようになります。
  • アプリケーションサーバが無くても、簡単にEJB3のJava Persistence API (JPA)を利用することができます。

リファレンス

セットアップ

  • プロジェクトのインポート
  • JDK5以上が必要です。
    あらかじめSeasar2とS2-Tigerをダウンロードして、EclipseのJavaプロジェクトとしてワークスペースにインポートしてください。
    S2Hibernate-JPA-x.x.x.zipを解凍してできたs2hibernate-jpaディレクトリをEclipseのJavaプロジェクトとしてワークスペースにインポートしてください。

  • 必要なjarファイル
  • S2Hibernate-JPAとして必要なjarファイルは、s2hibernate-jpa/libにそろってます。この他にSeasar2およびS2-Tigerのjarファイルが必要です。
    Hibernate3はコネクションプールやキャッシュの実装をいろいろ選べるようになっているので、S2Hibernate-JPAで用意していない実装が必要な場合は、Hibernateのサイトよりダウンロードしてください。

  • クラスパス
  • libのjarファイル(hsqldb.jar以外)とresources(jdbc.dicon、s2hibernate-jpa.dicon、log4j.properties、META-INF/persistence.xml)をCLASSPATHにとおせば、S2Hibernate-JPAを実行できます。Eclipseにインポートして使う場合は設定は不要です。

  • データベース
  • 簡単に機能を試すことができるように、RDBMSとしてHSQLDBを用意しています。lib/hsqldb.jarはHSQLDBを実行する上では必要ですが、本番では必要ありません。

基本的な使い方

S2Hibernate-JPAの機能を使用するにあたり、エンティティ、Dao(.java)、diconファイル、persistence.xmlの作成が必要になります。

エンティティ

Persistence APIの仕様に合わせてエンティティを作成します。

Dao(Data Access Object)

Daoの実装方法

  1. EntityManager型のフィールドを定義します。
    private EntityManager entityManager;
  2. コンストラクタあるいはプロパティ経由で実装オブジェクトを受け取るように記述します。
    public void setEntityManager(EntityManager entityManager) { 
    	this.entityManager = entityManager;
    }
  3. 各メソッドでEntityManagerに対する処理を記述します。
  4. public Employee getEmployee(int empno) {
        return entityManager.find(Employee.class, 7788);
    }

persistence.xml

クラスパスの通っているディレクトリにMETA-INFディレクトリを作成します。META-INFには、次のようなpersistence.xmlを格納します。

<?xml version="1.0" encoding="UTF-8"?>
<persistence>
	<persistence-unit name="persistenceUnit" transaction-type="JTA">
		<jta-data-source>jdbc/DataSource</jta-data-source>
		<properties>
			<property name="hibernate.dialect" 
			    value="org.hibernate.dialect.HSQLDialect"/>
			<property name="hibernate.jndi.class" 
			    value="org.seasar.extension.j2ee.JndiContextFactory"/>
			<property name="hibernate.transaction.manager_lookup_class" 
			    value="org.seasar.hibernate.jpa.transaction.S2TransactionManagerLookup"/>
			<property name="hibernate.show_sql" 
			    value="false"/>
			<property name="hibernate.format_sql" 
			    value="true"/>
			<property name="hibernate.use_sql_comments" 
			    value="false"/>
		</properties>
	</persistence-unit>
</persistence>

データソース名は、jdbc.diconの名前空間名.DataSourceコンポーネント名と一致させてください。

diconファイル

s2hibernate-jpa.diconをインクルードします。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE components PUBLIC "-//SEASAR//DTD S2Container 2.3//EN" 
	"http://www.seasar.org/dtd/components23.dtd">
<components namespace="s2hibernateJPA">
	<include path="javaee5.dicon"/>

	<component name="entityManagerFactory" class="javax.persistence.EntityManagerFactory">
		jpa.persistenceUnitManager.getEntityManagerFactory("persistenceUnit")
	</component>

	<component name="entityManager" class="org.seasar.framework.jpa.TxScopedEntityManagerProxy"/>
	
	<component class="org.seasar.hibernate.jpa.unit.HibernateProxiedObjectResolver"/>
</components>

jpa.persistenceUnitManager.getEntityManagerFactory()に渡す永続ユニット名はpersistence.xmlの定義と一致させてください。

複数の永続ユニットの使い方

複数のJPA実装を使う場合や、複数のJDBC DataSourceを使う場合などは、それぞれごとにpersistence.xmlとs2hibernate-jpa.diconを用意し、異なったクラスパス上のディレクトリまたはJarファイルに配置します。
例えば、次のような構成にします。

  • foo-classes
    • META-INF
      • persistence.xml
    • foo-jpa.dicon
    • エンティティクラス
  • bar-classes
    • META-INF
      • persistence.xml
    • bar-jpa.dicon
    • エンティティクラス
foo-classes/META-INF/persistence.xmlを次のようにします。
<?xml version="1.0" encoding="UTF-8"?>
<persistence>
	<persistence-unit name="fooPersistenceUnit" transaction-type="JTA">
		<jta-data-source>jdbc/fooDataSource</jta-data-source>
	...
foo-classes/foo-jpa.diconを次のようにします。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE components PUBLIC "-//SEASAR//DTD S2Container 2.3//EN" 
	"http://www.seasar.org/dtd/components23.dtd">
<components namespace="fooJPA">
	<include path="javaee5.dicon"/>

	<component name="fooEntityManagerFactory" class="javax.persistence.EntityManagerFactory">
		jpa.persistenceUnitManager.getEntityManagerFactory("fooPersistenceUnit")
	</component>

	<component name="fooEntityManager" class="org.seasar.framework.jpa.TxScopedEntityManagerProxy"/>

bar-classes/META-INF/persistence.xmlを次のようにします。
<?xml version="1.0" encoding="UTF-8"?>
<persistence>
	<persistence-unit name="barPersistenceUnit" transaction-type="JTA">
		<jta-data-source>jdbc/barDataSource</jta-data-source>
	...
bar-classes/bar-jpa.diconを次のようにします。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE components PUBLIC "-//SEASAR//DTD S2Container 2.3//EN" 
	"http://www.seasar.org/dtd/components23.dtd">
<components namespace="barJPA">
	<include path="javaee5.dicon"/>

	<component name="barEntityManagerFactory" class="javax.persistence.EntityManagerFactory">
		jpa.persistenceUnitManager.getEntityManagerFactory("barPersistenceUnit")
	</component>

	<component name="barEntityManager" class="org.seasar.framework.jpa.TxScopedEntityManagerProxy"/>