Hibernate のドキュメントに記載されているようにTABLE_PER_CLASS
、ポリモーフィックな関係を取得するときにパフォーマンスが大幅に低下します
2.2.4.1. クラスごとのテーブル
この戦略には、JPA 仕様、Hibernate リファレンス ドキュメント、Hibernate in Action、および他の多くの場所で説明されている多くの欠点 (特にポリモーフィック クエリと関連付け) があります。Hibernate は、SQL UNION クエリを使用してこの戦略を実装し、それらのほとんどを回避します。一般的に、継承階層のトップ レベルに使用されます。
@Entity @Inheritance(strategy = InheritanceType.TABLE_PER_CLASS) public class Flight implements Serializable { ... }
この戦略は、1 対多の関連付けが双方向である場合にサポートします。この戦略は IDENTITY ジェネレーター戦略をサポートしていません。ID は複数のテーブルで共有する必要があります。したがって、この戦略を使用する場合は、AUTO も IDENTITY も使用しないでください。
しかし、このシナリオでは、継承戦略に他に選択肢がないため、クエリを改善する方法を探しています。Comment は、抽象 Commentable クラスに対して M:1 の関係を持つ具体的なクラスです。
私の希望は、それが参照している Commentable の具体的なタイプを区別できる識別子列を Commentに格納し、クエリ内で CASE を使用することでした。
@NamedQuery(name = "Comments.withItemTitle",
query = "select c.commentBody, " +
"case " +
"when n.targetType = 'video' THEN (select v.title from Video v where v.id = c.target.id) " +
"when n.targetType = 'message' THEN (select m.title from Message m where m.id = n.target.id) " +
"when n.targetType = 'blog' THEN (select b.title from Blog b where b.id = n.target.id) " +
"end " +
"from Comment c")
しかし、休止状態は、ネストされた選択について、そのタイプを判別できないというエラーをスローします。これは postgre では合法のようです。Hibernate がネストされた SELECT 式をこのようにサポートしていれば、問題は解決しないでしょうか?
私の次のアイデアは、非正規化commentable.title
して各コメントに関連するものを保存することですが、明らかな理由でそれを行うのをためらっています. この質問の目的上、Commentable の継承構造を変更することはできません。
すべてのテーブルを一緒に UNION に休止状態にすることなく、このクエリを実行する他の方法はありますか?