この記事http://www.jroller.com/eyallupu/entry/hibernate_the_any_annotationと、この質問How to use Hibernate @Any-related annotation? でも で、@Any アノテーションの使い方を説明しました。しかし、DVD/VHS/BOOK ごとに借りるにはどうすればよいですか? DVD/VHS/BOOK でマッピング定義を行うにはどうすればよいですか?
2 に答える
ドキュメントに記載されているように、これはサポートされていないと思います:
2.4.5.2. @どれでも
@Any
注釈は、複数のテーブルからのクラスへのポリモーフィックな関連付けを定義します。このタイプのマッピングには、常に複数の列が必要です。最初の列は、関連付けられたエンティティのタイプを保持します。残りの列には識別子が保持されます。 この種のアソシエーションに対して外部キー制約を指定することは不可能であるため、これは (ポリモーフィックな) アソシエーションをマッピングする通常の方法として意図されているわけではありません。これは非常に特殊な場合 (例: 監査ログ、ユーザー セッション データなど) でのみ使用してください。
この注釈は、関連付けプロパティを共通の祖先エンティティを持たないさまざまなタイプのエンティティにマップするために導入されたことを理解していますが、双方向の関係のために他のエンティティが継承する基本タイプを導入する方がよいと思います。
こちらもご覧ください
はい、片側がポリモーフィック (@Any または @ManyToAny でマップ) である双方向の関連付けの問題は、Hibernate が無効な外部キーを自動生成することです。個人的には、これはバグであり、使用上のエラーではないと考えています。
外部キーを明示的に指定することで、これを回避できます。つまり、Hibernate に依存して推測しないでください。Borrow <--> DVD/VHS/Book の例では、Borrow と DVD/VHS/Book (「アイテム」) の間に双方向の多対 1 の関連付けが必要であるとします。項目への多態的な @Any メカニズムを使用する借用側と、借用する @OneToMany を使用する項目側。
しかし、後者のプロパティ/ゲッターでは、「ITEM_ID」など、使用する結合列も明示的に指定します。これにより、Hibernate は "ITEM_ID" のみを使用するようになり、反対側の @Any 定義からデフォルトで推測されるITEM_ID + ITEM_TYPE は(私が見たように)使用しなくなります。
DVD/VHS/Book の "Item" スーパークラスがない場合は、各クラスで次のように宣言する必要があります。
@Entity
class Book {
...
@OneToMany
@JoinColumn(name="item_id")
public List<Borrow> getBorrows() {
return this.borrows;
}
}