web-dev-qa-db-ja.com

逆関係および結合テーブルなしの@OneToMany?

これは "Hibernate @OneToMany without another join table" と同様の問題です。つまり、結合テーブルなしの@OneToMany関係が必要です。ただし、逆の関係も定義しないようにします。インバースを削除すると、結合テーブルが自動的に生成されるようです...これに対する回避策はありますか?

34
jsight

JPA 2.0以降では、結合テーブルの生成を回避する方法として@JoinColumnを使用できます。

それを試してみてください。

@OneToMany
@JoinColumn(name="COLUMN_NAME")

[〜#〜] update [〜#〜]

上記の情報は、EJB 3.0 o'reillyの本から抽出されています(@JoinColumnアノテーションはPHONEテーブルのCUSTOMER_ID列を参照します)。ただし、プレーンなJPA 1.0仕様はこの機能をサポートしていません。それが言うことは

単方向の1対多の関係は、1対多の外部キーマッピングを使用して実装できますが、このリリースではこのようなサポートは必要ありません。 1対多の関係に外部キーマッピング戦略を使用するアプリケーション移植性を確保するためにこれらの関係を双方向にする必要があります

1.0ではベンダー固有の実装です(そして理にかなっています、著者はJBossで働いています-Red Hatは休止状態の背後にあります)

しかしJPA 2.0実装でサポートされています

結合が外部キーマッピング戦略を使用した単方向OneToManyマッピング用である場合、外部キーはターゲットエンティティのテーブルにあります

52
Arthur Ronald

JPA 1.0仕様では、[〜#〜] not [〜#〜]は、結合なしの単方向OneToManyマッピングをサポートしますテーブル

JoinColumnOneToManyを使用することは、standardJPA 1.0では許可されていません(OneToOneManyToOne、またはManyToMany)。ただし、JPA 2.0です。

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ブックのリンクでは、問題を「回避する」ためのトリック(ターゲットテーブルを結合テーブルとしてマッピング)について説明していますが、これは読み取りに対してのみ機能し、書き込みは機能しません。

参照資料

16
Pascal Thivent

データベースに結合テーブルがない場合、データベース内の2つのテーブル間の関係は、主キーを参照する外部キーによって実現されます。リレーションシップがPK/FKを介している場合、FK列に値が入力されるように、ソースを参照するターゲットクラスにプロパティが必要です。ターゲットクラスのこのプロパティは、idまたはソースオブジェクトです。ソースオブジェクトの場合、ターゲットクラスに@ManyToOneを逆にする必要があります。

0
dinesh ranawat