オープンソース版TopLinkでEJB3

OracleのO/RマッピングフレームワークTopLinkGlashFish?にオープンソースとしてコントリビュートされました。これにより、GlashFish?TopLinkのEJB3のパーシステンス機能を利用できるようになります(ちなみに、GlashfishにはTopLinkのコアの部分だけがコントリビュートされており、コントリビュートされた部分はTopLinkエッセンシャルと呼ばれます)。ここでは、GlashFish?に含まれるTopLinkでEJB3を利用する方法を紹介します。まぁ、色々書いていますが、

HibernateのEntityマネージャも飽きてきたんで
オープンソース版のTopLinkでEJB3でも使ってみましょうか

ということですな。ちなみに、TopLinkGlassFish?プロジェクト上でEJB3のリファレンスインプリメンテーションとして開発されています。一言で言えば、Servlet/JSP仕様に対するTomcatみたいなもんですな(まぁ、Tomcatは今はリファレンスインプリメンテーションとされていませんが...)。

必要なjar GlassfishのWebページからglasshfishをダウンロードし、インストールします(注:現在はOracleのWebページ上でTopLink JPAとして公開されているのでGlassfishは必要ありません)。GLASHFISH_HOME/libディレクトリにある下記のjarを取得します。

persistence.xml

EJB3の永続化の設定は、persistence.xmlに記述します。Hibernate3 EntityManager?との記述とびみょーに違うので注意しましょう。

<?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns="http://java.sun.com/xml/ns/persistence"> 
  <persistence-unit name="em1"> 
    <provider>oracle.toplink.essentials.ejb.cmp3.EntityManagerFactoryProvider</provider> 
    <class>org.ultimania.ejb.Customer</class>
    <class>org.ultimania.ejb.Purchaseorder</class>
    <properties> 
      <property name="jdbc.driver" value="org.hsqldb.jdbcDriver"/>
      <property name="jdbc.user" value="sa"/>
      <property name="jdbc.password" value=""/>
      <property name="jdbc.connection.string" 
                value="jdbc:hsqldb:database/shop"/>
      <property name="toplink.logging.level" value="DEBUG"/> 
      <property name="toplink.platform.class.name"
                value="oracle.toplink.essentials.platform.database.HSQLPlatform" />
    </properties> 
  </persistence-unit> 
</persistence> 

toplink.platform.class.nameプロパティには、データベース固有のプラットフォームクラスを記述します。これは、HibernateのDialectのようなものです。プラットフォームクラスには、次のクラスを利用できます。

データベースプラットフォーム
MS Accessoracle.toplink.essentials.platform.database.AccessPlatform
Attunityoracle.toplink.essentials.platform.database.AttunityPlatform?
Cloudscape(旧バージョン)oracle.toplink.essentials.platform.database.CloudscapePlatform?
メインフレーム版DB2oracle.toplink.essentials.platform.database.DB2MainframePlatform?
DB2,Derby,Cloudscapeoracle.toplink.essentials.platform.database.DB2Platform
dBASEoracle.toplink.essentials.platform.database.DBasePlatform?
HSQLDBoracle.toplink.essentials.platform.database.HSQLPlatform
Infomixoracle.toplink.essentials.platform.database.InformixPlatform?
MySQL4oracle.toplink.essentials.platform.database.MySQL4Platform
Point Baseoracle.toplink.essentials.platform.database.PointBasePlatform?
SQL AnyWhere?oracle.toplink.essentials.platform.database.SQLAnyWherePlatform?
SQL Serveroracle.toplink.essentials.platform.database.SQLServerPlatform?
Sybaseoracle.toplink.essentials.platform.database.SybasePlatform?
Oracle TimesTenoracle.toplink.essentials.platform.database.TimesTenPlatform?
Oracleoracle.toplink.essentials.platform.database.oracle.OraclePlatform?

EntityManagerの取得 執筆時現在、EJB3標準では、次のようにしてEntityManager?を取得します。

EntityManagerFactory factory = Persistence.createEntityManagerFactory("em1");
EntityManager em = factory.createEntityManager();

しかし、この方法では、TopLinkEntityManager?を取得することはできませんでした。次の様にしてEntityManagerFactoryProvider?を利用する必要があります(注:現在は、上記のコードで正しく動作します)。

 EntityManagerFactoryProvider provider = new EntityManagerFactoryProvider();
 EntityManagerFactory factory = provider.createEntityManagerFactory("em1",new HashMap());
 EntityManager em = factory.createEntityManager();

なお、EntityManagerFactoryProvider?#createEntityManagerFactory?HashMap?には、persistence.xmlのプロパティを設定することができます。

実行

実行時のVMのオプションに次のようにjavaagentを指定します。

$java -javaagent:lib/toplink-essentials-agent.jar HageTest

その他Tips

主キーの自動生成

EJB3はテーブルを利用してソフトウェア的にSEQUENCEを生成する機能があります。TopLinkのPlatformでは殆どのDBにおいてNativeなSEQUENCEに対応していないので、テーブルシーケンスを利用する必要があります。テーブルシーケンスの自動生成を利用する際には、次のようにSEQUENCEテーブルを生成、初期化しておく必要があります。

> CREATE SEQUENCE (SEQ_COUNT integer, SEQ_NAME varchar(16));
> INSERT INTO SEQUENCE (0, 'SEQ_ORDERID');

EJB3側では、次のように実装します。

@Id(generate = GeneratorType.TABLE, generator="SEQ_ORDERID")
public int getOrderid() {
  return orderid;
}

別のシーケンスを生成したい場合は、シーケンス名を定義した列を作成し、@Idのgenerator属性でシーケンス名を指定します。

デフォルトではシーケンスの値は50づつ増えます。

ログレベル

toplink.logging.levelプロパティで指定するログレベルは、下記の値を指定することができます。

プロパティの設定方法

TopLink固有のプロパティの設定を行う方法は次の3種類あります。

ソースからビルド

CVSからチェックアウトしたglassfish/entity-persistenceで次のことをやる。

メモ

リンク

ビルドメモ

GlassfishのCVSリポジトリよりチェックアウトしてビルドする方法のメモです。下記のようにして、bootstrap,entity-persistence,persistence-api,transaction-apiモジュールをチェックアウトします。

$ cvs -d :pserver:guest@cvs.dev.java.net:/cvs checkout glassfish/bootstrap
$ cvs -d :pserver:guest@cvs.dev.java.net:/cvs checkout glassfish/transaction-api
$ cvs -d :pserver:guest@cvs.dev.java.net:/cvs checkout glassfish/persistence-api
$ cvs -d :pserver:guest@cvs.dev.java.net:/cvs checkout glassfish/entitry-persistence

transaction-api,persistence-api,entity-persistenceの順でビルドします。

$ cd glassfish/transaction-api
$ ant
$ cd ../persistence-api
$ ant
$ cd ../entity-persistence
$ ant

glassfishディレクトリの上のpublish/glassfish/libディレクトリの下に下記のjarが生成されます。

javaee.jar
toplink-essentials-agent.jar
toplink-essentials.jar

コメント等



トップ   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS