オープンソース版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を取得します。

  • toplink-essentials.jar
  • toplink-essentials-agent.jar
  • antlr.jar
  • javaee.jar
  • asm.jar
  • asm-attrs.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プロパティで指定するログレベルは、下記の値を指定することができます。

  • OFF
  • SEVERE
  • WARNING
  • INFO
  • CONFIG
  • FINE (デフォルト)
  • FINER
  • FINEST
  • ALL

プロパティの設定方法

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

  • persistence.xmlに記述
  • EntityManagerFactoryProvider?#createEntityManagerFactory?のパラメータで指定
  • JavaVM起動オプションの-D<プロパティ名>=<プロパティ値>で指定

ソースからビルド

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

  • libディレクトリを作成し、最初に準備したjar(toplink-essentials.jar/toplink-essentials-agent.jar以外)をコピー
  • build.propertiesに下記の設定を追記
    antlr.jar=lib/antlr.jar
    asm.jar=lib/asm.jar
    asm-attrs.jar=lib/asm-attrs.jar
    javaee.jar=lib/javaee.jar
    
    javac.source=1.5
    javac.debug=true
    javac.optimize=false
    javac.deprecation=true
    entity-persistence.jar=toplink-essentials.jar
    entity-persistence-agent.jar=toplink-essentials-agent.jar
  • antを実行 すると、toplink-essentials.jar/toplink-essentials-agent.jarが生成される。

メモ

  • HSQLDBのPlatformは外部キーをサポートしていない
  • PostgerSQL用のPlatformはサポートされていない

リンク

ビルドメモ

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

コメント等



*1 , http://keybusinesstips.info/zimulti.html rimoslim, 46951, http://keybusinesstips.info/prednisone.html prednisone weight gain, 888, http://amortization-schedules-free.info/cipro.html cipro, %-OO, http://primitivebusinessjunction.com/seroquel.html seroquel, =[[[, http://stsfrancisandclarenj.org/lasix.html lasix renal scan, %-
*2 , http://findaddress.biz/inderal.html inderal, 276, http://hilalaviv.com/metformin.html buy metformin 500mg, 8-OO, http://ramboestrada.com/benicar.html benicar, ofcbl, http://primitivebusinessjunction.com/cipro.html cipro online, rvta, http://amortization-schedules-free.info/amoxil.html amoxil, rwtsf, http://keybusinesstips.info/tamiflu.html tamiflu, oilzer, http://bethgiacummo.org/clomid.html clomid and us, >:PP, http://beresexecutive.com/mobic.html mobic, yeqq, http://arizonaterritory-1878.com/rimonabant.html rimonabant, >:-], http://keybusinesstips.info/vermox.html vermox.com, 8-]], http://grantham.biz/celexa.html buy celexa, :(, http://findaddress.biz/tetracycline.html tetracycline hci, iwrme, http://arizonaterritory-1878.com/mobic.html mobic cost, =-

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2012-08-04 (土) 06:50:31 (3366d)