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が必要になります