ORM比較(3) - EclipseLink

ちょっと前にJPA2.0の参照実装に決まった、EclipseLink(元『TopLink Essentials』)です。名前の通り、Eclipseプロジェクトのサブプロジェクトになっています。これから有名になりそうなライブラリですね。
プロジェクトの公式ページは http://www.eclipse.org/eclipselink/ になります。

動かすために必要なライブラリは、上記のページからDownloadしたら揃う様になっていますね。実際には以下の通りです。

  • eclipselink.jar
  • javax.persistence_1.99.0.jar
  • javaxactivation_1.1.0.jar
  • javax.mail_1.4.0.jar
  • javax.xml.bind_2.0.0.jar
  • javax.xml.stream_1.0.0.jar
  • jaxb-impl.jar
  • jaxb-xjc.jar
  • commonj.sdo_2.1.1.jar
  • postgresql-8.3-603.jdbc4.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("EclipseLinkSample");
		} catch (Exception ex) {
			throw new ExceptionInInitializerError(ex);
		}
	}

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

persistence.xml には、DBへの接続設定とEntityのクラス一覧が必要になります。

<?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="EclipseLinkSample">
		<provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
		<class>ch.jpn.taoe.orm_comp.eclipselink.entity.HUser</class>
		<class>ch.jpn.taoe.orm_comp.eclipselink.entity.HUserGroup</class>

		<properties>
			<property name="eclipselink.jdbc.driver" value="org.postgresql.Driver"/>
			<property name="eclipselink.jdbc.url" value="jdbc:postgresql://server:5432/sample_test"/>
			<property name="eclipselink.jdbc.user" value="postgres"/>
			<property name="eclipselink.jdbc.password" value="postgres"/>

			<property name="eclipselink.jdbc.read-connections.min" value="1" />
			<property name="eclipselink.jdbc.write-connections.min" value="1" />
			<property name="eclipselink.jdbc.batch-writing" value="JDBC" />

			<property name="eclipselink.ddl-generation" value="create-tables"/>
			<property name="eclipselink.ddl-generation.output-mode" value="database"/>

			<!-- Logging -->
			<property name="eclipselink.logging.level" value="FINE" />
			<property name="eclipselink.logging.timestamp" value="true" />
			<property name="eclipselink.logging.session" value="true" />
			<property name="eclipselink.logging.thread" value="true" />
		</properties>

	</persistence-unit>
</persistence>

最後に、実際にORMを使う部分のソースです。JPA2.0(まだ決定ではない)でデータを取得する場合にはJPQLではなく、ちゃんと型安全な取得関数が使えます。ようやくまともに使えそうな感じですね。ただし、1つ注意点があり EclipseLinkのデフォルトの設定ではEntityの状態が常にCacheされるため、外部からDBのデータを変更しても反映されません。Cacheの設定は、ON/OFFしかないため、OFFにすると全ての取得時にCacheが使われなくなります。メソッド単位で指定できたら便利だと思うんですけどね・・・。

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

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

		EntityManager em = EntityManagerFactory.getEntityManager();
		JpaEntityManager jpaEm = JpaHelper.getEntityManager(em);

		System.out.println("Select Query:");
		ExpressionBuilder builder = new ExpressionBuilder();
		List<HUserGroup> list = jpaEm.createQuery(builder.getBaseExpression(), HUserGroup.class).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/EclipseLink から取得できます。良かったら自分で動かしてみてください*1

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