2008年1月25日金曜日

jPersist問い合わせの結果

STIについて作者さまに問い合わせた結果、次のような回答をちょうだいした。

ドキュメントの不備で「基底クラスがテーブル名である必要があるように見えちゃうよね。 あなたの「Footballer」「Clicketer」のパターンであれば、それぞれに対応するテーブルを作成する必要があります。
…エエエエェェェー!?これって、つまり「SingleTable」で継承を解決してないのでは!?俺が間違ってるんだろうか?もぅワカラン。orz
  • Player...ID,nameを持つ。
  • Footballer extends Player...clubを持つ。
  • Clicketer extends Player...battingAverageを持つ。
この関係にある時、解決法方途しては次のようなパターンがある。
Single Table Inheritance
「Player」「Footballer」「Clicketer」全てのClassのメンバを保持するPlayersテーブルでやりくりする。
  • Players...id,name,club,battingAverage
Concrete Table Inheritance
サブクラスごとにTableを作成する。各Tableには基底クラスのメンバを持たせる。
  • Footballers...id,name,club
  • Clicketer...id,name,battingAverage
Class Table Inheritance
各Classに対応したTableを作成する。
  • Players...id,name
  • Footballers...club
  • Clicketers...battingAverage
この中で、SingleTableInheritanceはPlayerを扱うときにTableのJoinが発生しない。自分ではこれをやるには次のようなカンジの操作でできるはずだという理解をしている。
Footballer p0 = new Footballer("player01", "club01");
p0.save(dbm);
Clicketer c0 = new Clicketer("player01", 30L);
c0.save(dbm);
これで、勝手にPlayersTableに保存される「べき」。取得する時は、
Collection<Player> players = dbm.loadObjects(new ArrayList<Player>(), Player.class);
という具合に取得すれば、RDB的にはPlayersTableから取得し、Java的にはそれの各メンバのnullをチェックして「Footballer」「Clicketer」が生成される「べき」。Footballerなのにclubがnullだったりしたら解決できなさそぅだけど、それはO→Rする前にチェックするとして今は考えない。 …なんば間違っとぅとー!?わかんねぇ。 まぁ、継承の話よりも関連の話をもっと色々試す方が重要なんだけどね。気になってしまって。。小さか男ばい。

Blogged with Flock

コメントを投稿