Hibernate第2レベルのキャッシュとデータベーススキーマの削除カスケード
-
28-09-2019 - |
質問
Javaアプリケーションには、データベース(SQL ServerまたはMySQL)にマッピングされた約100のクラスがあります。 HibernateをORMとして使用しています(XMLマッピングファイルを使用)。
指定します FOREIGN KEY
データベーススキーマの制約。私たちのほとんど FOREIGN KEY
制約も指定します ON DELETE CASCADE
.
私たちは最近、いくつかのパフォーマンスの問題を軽減するために、冬眠2レベルのキャッシュ(一般的なエンティティやコレクション用)を可能にしました。
2番目のレベルのキャッシュを有効にして以来、パフォーマンスが向上しました。ただし、ObjectNotFoundExceptionsにも遭遇し始めました。
データベースがテーブルの行を削除しているため、ObjectNotFoundExceptionsが発生しているようです その下 冬眠。たとえば、aを削除する場合 Parent
Hibernateを使用すると、データベーススキーマが表示されます ON DELETE CASCADE
何かに Child
エンティティ。これは明らかに冬眠の知識なしで起こるので、2番目のレベルのキャッシュを更新する機会がありません(そして削除されたものを削除します Child
エンティティ)。
この問題の解決策は削除することだと思います ON DELETE CASCADE
データベーススキーマから(ただします FOREIGN KEY
s)。代わりに、削除するようにHibernateを構成する必要があります Child
通常の削除SQLを使用する依存関係により、Hibernateが2番目のレベルのキャッシュを更新するようになります。いくつかの限られたテストでは、このアプローチが機能しているように見えることが示されています。
これについてコミュニティのフィードバックを得たかったのです。私たちの問題の代替(より良い?)ソリューションはありますか?他の人はこの状況をどのように処理しますか?一般的に、使用するときに考慮すべきトレードオフは何ですか ON DELETE CASCADE
Hibernateを使用したデータベーススキーマで?
ありがとう。
解決
常にプログラムを介して削除する場合は、データベースから制約を取り除き、冬眠オブジェクトに削除カスケードを削除して、関連する人の世話をすることをお勧めします。
一方、Javaアプリで時々オブジェクトを削除し、データベースレベルで時々オブジェクトを削除する場合、奇妙なハンギングデータが表示されます。この場合、より複雑なアプローチを調べる必要があるかもしれません。これが当てはまるかどうかは明確ではなかったので、ここで詳細に説明することはありません。
他のヒント
使用している場合 ON DELETE CASCADE
データベースでは、このように冬眠を伝える必要があります。
@OnDelete(action = OnDeleteAction.CASCADE)
これはとは異なります
@OneToMany(cascade = CascadeType.ALL, orphanRemoval = true)
後者は、メモリの関係について何かをhibenrateに伝えています。最初のものは、データベースレベルで削除SQLステートメントを最適化します。 Hibernateは、DBがDelete Childsの世話をしていることを知る必要があります。
このメカニズムの適切な説明については、このサイトをご覧ください。
http://eddii.wordpress.com/2006/11/16/hibernate-on-deletecascade-performance/
そして、この機能の開発者からのコメント:
http://www.mail-archive.com/hibernate-devel@lists.sourceforge.net/msg03801.html