これは、結合テーブルのない@OneToMany関係が必要であるという点で、「個別の結合テーブルのないHibernate@OneToMany」と同様の問題です。ただし、逆の関係も定義したくありません。逆を削除すると、結合テーブルが自動的に生成されるようです...これに対する回避策はありますか?
3 に答える
JPA 2.0以降では、結合テーブルの生成を回避する方法として@JoinColumnを使用できます。
それを試してみてください。
@OneToMany
@JoinColumn(name="COLUMN_NAME")
アップデート
上記の情報は、EJB 3.0 o'reillyの本から抽出されたものです(@JoinColumnアノテーションがPHONEテーブルのCUSTOMER_ID列を参照していることを確認してください)。ただし、プレーンJPA1.0仕様はこの機能をサポートしていません。それが言うことは
一方向の1対多の関係は、1対多の外部キーマッピングを使用して実装できますが、このリリースではそのようなサポートは必要ありません。1対多の関係に外部キーマッピング戦略を使用するアプリケーションは、移植性を確保するためにこれらの関係を双方向にする必要があります
したがって、1.0ではベンダー固有の実装です(そしてそれは理にかなっています、作者はJBossで働いています-休止状態の背後にある赤い帽子の部門)
ただし、JPA2.0の実装ではサポートされています
結合が外部キーマッピング戦略を使用した単方向OneToManyマッピングの場合、外部キーはターゲットエンティティのテーブルにあります。
JPA 1.0仕様は、結合テーブルのない単方向のOneToManyマッピングをサポートしていません。
また、aJoinColumn
での使用は標準のJPA 1.0OneToMany
では許可されていません( 、、またはでのみ)。ただし、JPA2.0ではあります。OneToOne
ManyToOne
ManyToMany
JPA 1.0仕様から:
2.1.8.5.1一方向のOneToMany関係
次のマッピングのデフォルトが適用されます。
エンティティAは。という名前のテーブルにマップされます
A
。エンティティBは。という名前のテーブルにマップされますB
。名前が付けられた結合テーブルがありますA_B
(所有者名が最初)。この結合テーブルには、2つの外部キー列があります。1つの外部キー列はテーブルを参照し、テーブルA
の主キーと同じタイプA
です。この外部キー列の名前は、次の連結として形成されます。エンティティAの名前。"_"; テーブルの主キー列の名前A
。もう1つの外部キー列はテーブルBを参照し、テーブルの主キーと同じタイプです。B
それに固有のキー制約があります。この外部キー列の名前は、次の連結として形成されます。関係プロパティまたはエンティティAのフィールドの名前。"_"; テーブルの主キー列の名前B
。
要約すると、結合テーブル(および完全な読み取り/書き込みサポート)を必要とせず、それでもJPAに準拠したい場合は、関連付けを双方向(inverse
サイド付き)にします。
以下のwikiブックのリンクでは、問題を「回避」するためのトリック(ターゲットテーブルを結合テーブルとしてマッピングする)について説明していますが、これは読み取りに対してのみ機能し、書き込みは機能しません。
参考文献
- JPA1.0仕様
- 2.1.8.2双方向のManyToOne/OneToManyの関係
- 2.1.8.5.1一方向のOneToMany関係
- 9.1.6 JoinColumnアノテーション(このアノテーションを使用できるコンテキストについて説明します)
- JPAWikiブック
データベースに結合テーブルがない場合、データベース内の2つのテーブル間の関係は、主キーを参照する外部キーによって実現されます。関係がPK/FKを介している場合、FK列に値が入力されるように、ソースを参照するプロパティがターゲットクラスに存在する必要があります。ターゲットクラスのこのプロパティは、IDまたはソースオブジェクトである可能性があります。ソースオブジェクトの場合は、ターゲットクラスに逆@ManyToOneが必要です。