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