質問

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 KEYs)。代わりに、削除するように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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top