上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

役に立ったらぽちっとよろしく。 人気ブログランキングへ

OとRにはさまれて [2008/03/12 (水)]

O/Rマッピングで表したいモデルがあるのだけども、うまくいくのだろうか…という話。

そのモデルと言うのは、結構ありがちなパターン。まず、テーブルとして顧客、担当者、アルバイト、社員がある。で、クラスの関係は、顧客から担当者がManyToOneで担当者はアルバイトと社員の基底になる。たぶんJPAならInheritanceType.JOINEDを選ぶ事になる。

クラス図

で、疑問に思うのはアルバイトの人が社員になる場合。Java等ほとんどの言語は、動的継承をサポートしないわけで、アルバイトクラスのインスタンスが直接に社員クラスのインスタンスには変われない。必要ならば、インスタンス自体を作り変えるか、Stateパターン[GoF]を使う必要がある。これはO/RのOの部分の制約になる。

で、アルバイトインスタンスを社員インスタンスに作り変えるために、一旦アルバイトインスタンスを削除しようとする。この時、O/RのRの部分は担当者テーブル内の行まで消してしまうのだろうか?だとすると、担当者テーブルに外部キーを張っている顧客は…。このRの部分の制約でインスタンスを削除する事が出来ない。

仕方ないので、Stateパターン的な方法にしようか思うと担当者クラスにStateとして社員やアルバイトを切り替えられるようなJPAの機能がない…。

で、なんとか考えた解決策…担当者に社員とアルバイトそれぞれへのOneToOneフィールドを持たせて、FetchType.LAZYにしておく。ゲッタで担当者の切替フィールドを見て、どちらからStateを取得するか決める。LAZYが気に入らないなら@PostLoadでその操作をすぐに実行する。取得以外の動作はJPAのカスケードで担当者から各State(社員かアルバイト)へ伝播させれば楽かも。…他も色々考えたけど…どうもうまくいかない…。

ていうか、、、JPAが手強いせいで、全部技術ネタになってしまった…。どこにもオチが無い!
え?技術ブログで毎回オチ入れる必要はないだろうって?…だって関西人だもん。

スポンサーサイト

役に立ったらぽちっとよろしく。 人気ブログランキングへ

コメント
この記事へのコメント
コメントを投稿する

トラックバック
この記事のトラックバックURL
この記事へのトラックバック
Copyright © ふらふら技術者の日記 All Rights Reserved.
Powered by FC2 Blog
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。