ORM比較(4) - OpenJPA

このOpenJPAは、名前の通りJPA準拠のJacartaプロジェクト産ORMです。JPA対応なので、使い方は前々回(ORM比較(2) - Hibernate - しがないプログラマ の日記) のJPA版と同じになります。
公式ページは http://openjpa.apache.org/ になります。

動かすために必要なライブラリは、以下の通りです。

  • c3p0-0.9.1.2.jar
  • commons-collections-3.2.jar
  • commons-lang-2.1.jar
  • geronimo-jpa_3.0_spec-1.0.jar
  • geronimo-jta_1.1_spec-1.1.jar
  • openjpa-1.2.1.jar
  • postgresql-8.3-603.jdbc4.jar
  • serp-1.13.1.jar

それでは実際のソースを。
Entityクラスは、JPAに従っているため前々回の ORM比較(2) - Hibernate - しがないプログラマ の日記と同じになるので省略です。

コネクションの作成部分も前回と前々回のJPA版と変わらないです。設定ファイルも同じで、クラスパス内の META-INF/persistence.xml になります。

public class EntityManagerFactory {
	private static final javax.persistence.EntityManagerFactory emf_;
	static {
		try {
			emf_ = Persistence.createEntityManagerFactory("OpenJpaSample");
		} catch (Exception ex) {
			throw new ExceptionInInitializerError(ex);
		}
	}

	public static EntityManager getEntityManager() {
		return emf_.createEntityManager();
	}
}

persistence.xml には、DBへの接続設定とEntityのクラス一覧が必要になります。今回、コネクションのプーリングに、c3p0を使う設定になっています。

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="1.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_1_0.xsd">
	<persistence-unit name="OpenJpaSample">
		<provider>org.apache.openjpa.persistence.PersistenceProviderImpl</provider>
		<class>ch.jpn.taoe.orm_comp.openjpa.entity.HUser</class>
		<class>ch.jpn.taoe.orm_comp.openjpa.entity.HUserGroup</class>

		<properties>
			<property name="openjpa.jdbc.DBDictionary" value="postgres"/>
			<property name="openjpa.ConnectionDriverName" value="com.mchange.v2.c3p0.ComboPooledDataSource"/>
			<property name="openjpa.ConnectionProperties"
				value="driverClass=org.postgresql.Driver,
					   jdbcUrl=jdbc:postgresql://server:5432/sample_test,
					   user=postgres,
					   password=postgres,
					   acquireIncrement=5,
					   initialPoolSize=5,
					   minPoolSize=5,
					   maxPoolSize=5,
					   maxStatements=500,
					   maxStatementsPerConnection=100,
					   checkoutTimeout=3000
				"/>

			<property name="openjpa.jdbc.SynchronizeMappings" value="buildSchema(ForeignKeys=false)" />
			<property name="openjpa.Log" value="DefaultLevel=INFO,SQL=TRACE" />
			<property name="openjpa.ConnectionFactoryProperties" value="PrettyPrint=true, PrettyPrintLineLength=72"/>
			<property name="openjpa.LockManager" value="pessimistic" />
			<property name="openjpa.MaxFetchDepth" value="3" />
			<property name="openjpa.LockTimeout" value="30000" />
		</properties>
	</persistence-unit>
</persistence>

最後に、実際にORMを使う部分のソースです。JPAなので前々回のものとまったく同じで、JPQLを使ってデータを取得しています。

public class Main {
	public static void createEntities() { /*省略*/ }

	public static void main(String[] args) {
		if (false) createEntities();

		EntityManager em = EntityManagerFactory.getEntityManager();

		System.out.println("Select Query:");
		List<HUserGroup> list = em.createQuery("select g from HUserGroup g").getResultList();
		for (HUserGroup group: list) {
			System.out.println(group.userGroupId + ":");
			for (HUser user: group.users) {
				System.out.println("  " + user.userId + "/" + user.password);
			}
		}
	}
}

以上です。

上記のソースは、Subversionにて http://taoe.jpn.ch:8080/svn/trunk/orm_compare/OpenJPA から取得できます。良かったら自分で動かしてみてください*1

*1:やっぱりPostgreSQLが必要になります