読者です 読者をやめる 読者になる 読者になる

Challenge Java EE !

Java EEを中心に趣味や仕事における開発メモを書いています。

JPAで複合主キー・外部キー関連で諦めてしまったパターン

JPA EclipseLink

以下のようなテーブル(とあるテーブルを抜粋してシンプルにしたもの)をJPAでEntityをNetBeansから自動生成して、デプロイしようとしたらエラーとなりました。

f:id:kikutaro777:20130307170909j:plain

Caused by: Exception [EclipseLink-7220] (Eclipse Persistence Services - 2.3.2.v20111125-r10461): org.eclipse.persistence.exceptions.ValidationException
Exception Description: The @JoinColumns on the annotated element [field hogeEntity] from the entity class [class jp.co.hoge.entity.Foo] is incomplete. When the source entity class uses a composite primary key, a @JoinColumn must be specified for each join column using the @JoinColumns. Both the name and the referencedColumnName elements must be specified in each such @JoinColumn.

色々調べてみると複合主キー(Composite Primary Key)のテーブルがあって、その子テーブルのキーが複合主キーにはいなく単なるカラムとしてあるだけで、Uniqueキー&外部キー(とカスケード)となっている場合、JPAにはじかれてしまう?感じです。

同じようなことトライしてる人は結構たくさんいるっぽい(海外のみ…)ですがあまり良い回答がみつからず…。

二人がかりで結構調べたのですが駄目で、結局スキーマ変えて対応してしまいました orz
JPA力が足りないのか、英語力が足りないのか、そもそもテーブルとしてBad Practiceなのか。

上記では製品と1:1で製品仕様情報のテーブル持っていますが、BLOBサイズが大きいのと、バッチで削除されることもあるため独立したテーブルとなっているとのこと。また、キーを仕様情報IDだけじゃなくて、キー1、キー2、キー3、仕様情報IDの複合主キーにすればいい、というのも
ありますが、キー1、2、3を知らない他テーブルがこのテーブルを使い回しこともあるとのことで、こういう設計になったようです。

DBチームからは「なんでできないんじゃー」と突っ込まれますが、なぜ上記エラーをJPAに怒られるのかイマイチ理解できておらず、何とも。。。
しかし、そんな複雑な仕組みじゃない気がするのだけどなぁ。

もう後戻りできないので今回は諦め方針でしたが、後学のために、もしご存じの方がいたらコメント等頂けると嬉しいです(^^;…なんて

にほんブログ村 IT技術ブログへ
にほんブログ村
にほんブログ村 IT技術ブログ Javaへ
にほんブログ村