DBコンバータへの道(5)

<< 戻る   トップ >>

先週の木曜日(8月29日)、とにかく丸一日の仕事時間を「技量維持」に使うことにして、DBコンバータの作成を試みた。できればその日一日で決着をつける津守だったのだが、エラーが出て停滞した。しかもそのエラー、NetBeans を再起動したらとれるというかなり情けない代物であった。その後は細々とプログラミングを続けてきた。

(1) Derby 上で表を作る

データベース表を Derby 上に作成する。ここでひとつ検討しなくてはならないのが、MySQL の制約 auto_increment の扱いだ。この制約は、Derby ではそのままでは使えない。

id INTEGER NOT NULL GENERATED DEFAULT AS IDENTITY (START WITH 1, INCREMENT BY 1)

このように GENERATED を追加することによって自動生成することができる。なお、この項目は derby 10.4 日本語マニュアルの「CREATE TABLE 文」の中のリンク「発番列仕様」に記述されている。

ところで、id の自動生成は JPA 側のアノテーション @GeneratedValue でも指定可能だったはず。今回は、既存の表の自動生成された値を新しい表に入力し、その後は自動生成を発動させたい。とりあえず GENERATED 制約?は仕様せず、複製してから @GaneratedValue を追加することを試みてみたい。

(2) 二つのデータベースを操作する

とりあえず GENERATED 抜きの基礎データベースを作ってみた。さらにそこからエンティティクラスを生成した。これで一つのプロジェクト Sesto-P1 に MySQL と Derby の二つの DBMS が同居可能な状態になったわけである。さて、それでは一つ一つの記事を表示しながら複製するウェブページというモノを作成してみよう。

ここでいろいろととエラーが発生するのだが、ようやく肝心な所にたどり着いた。かねがね疑問に思っていた「ひとつのウェブアプリケーションプロジェクトの中に、二つの DBMS を搭載できるか?」ということについて、出口が見えてきた。まず、Sesto-P1/setup/glassfish-resources.xml (TOMCAT の server.xml、転じて context.xml に相当する設定ファイルと思われる)には、<jdbc-connection-pool> として二つのデータベースが記述されている。ちなみに、どこに登録されているのかと思っていたユーザ名・パスワードもここにある。つぎに、永続性設定の Sesto-P1/src/conf/persistence.xml を観てみると、残念ながらここには mysql の永続性ユニットのみが登録されていて derby のユニットは生成されていない。いっそワイルドかつスパルタンに persistence.xml を手で編集してしまおうかとも思ったのだが、プロジェクト右クリック⇨新規⇨持続性⇨持続性ユニットで追加できることがわかった。あとはセッションビーンでEntityManagerのアノテーション@PersistenceContextを指定するところで、unitName パラメータを与える。

    @PersistenceContext( unitName = "Sesto-P1PU" )    
    EntityManager em;

一つのウェブアプリケーションで複数のデータベースを扱うことに何の問題もない。データベースの数だけの EntityMaganger を生成すればよいのだ。現時点で分かっている手順を示す。

  1. データベース及び表を作成する。
  2. JPA エンティティを作成する。おそらくこの時点で glassfish-resouce.xml に当該データベースが登録されるものと思われる。
  3. しかしながら、2番目以降のデータベースの場合、persistence.xml には登録されないので、持続性ユニットの追加を行う

(3) いくつかの謎

今回の動作で、謎であったのが persistence.xml の "eclipselink.ddl-generation" の設定だ。とりあえずデフォルトと思しき "create-tables" を指定したのだが、"jdbc:derby://localhost:1527/nanban_web" 内のスキーマ NANBAN 内に新たに表を作られてしまった。上記工程 (1) の表はスキーマ APP に作ってあったのだ。調査を課題としたい。

いろいろとズッコケたり袋小路に迷い込んだりしながらとりあえず一件のコピーには成功した。次は "crate-tables" 問題と @ManyToMany でのデータ追加について取り扱うことにする。


作成: 2013-09-03 13:02:25.0更新: 2013-09-03 13:02:25.0
http://museo-anonimo.jp/nanban/?id=1230,http://museo-anonimo.jp/nanban/tr/1230