私たちのJavaアプリケーションには、データベース(SQL ServerまたはMySQL)にマップされた約100のクラスがあります。ORMとしてHibernateを使用しています(XMLマッピングファイルを使用)。
FOREIGN KEY
データベーススキーマで制約を指定します。ほとんどのFOREIGN KEY
制約では、も指定されていますON DELETE CASCADE
。
最近、パフォーマンスの問題を軽減するために、Hibernateの第2レベルのキャッシュ(人気のあるエンティティとコレクション用)の有効化を開始しました。
2次キャッシュを有効にしてから、パフォーマンスが向上しました。ただし、ObjectNotFoundExceptionsも発生し始めています。
データベースがHibernateの下のテーブル行を削除しているため、ObjectNotFoundExceptionsが発生しているようです。たとえば、Parent
Hibernateを使用してを削除すると、データベーススキーマはON DELETE CASCADE
すべてのChild
エンティティに適用されます。これは明らかにHibernatesの知識がなくても発生するため、第2レベルのキャッシュを更新する(および削除されChild
たエンティティを削除する)機会はありません。
この問題の解決策はON DELETE CASCADE
、データベーススキーマから削除することです(ただし、FOREIGN KEY
sは保持します)。代わりに、Child
通常の削除SQLを使用して依存関係を削除するようにHibernateを構成する必要があります。これにより、Hibernateは第2レベルのキャッシュも更新します。いくつかの限られたテストでは、このアプローチが機能しているように見えることが示されています。
これについてコミュニティからのフィードバックをもらいたかったのです。私たちの問題に対する代替の(より良い?)解決策はありますか?他の人はこの状況にどのように対処しますか?ON DELETE CASCADE
一般に、 Hibernateを使用してデータベーススキーマで使用する場合に考慮すべきトレードオフは何ですか?
ありがとう。