7

私たちのJavaアプリケーションには、データベース(SQL ServerまたはMySQL)にマップされた約100のクラスがあります。ORMとしてHibernateを使用しています(XMLマッピングファイルを使用)。

FOREIGN KEYデータベーススキーマで制約を指定します。ほとんどのFOREIGN KEY制約では、も指定されていますON DELETE CASCADE

最近、パフォーマンスの問題を軽減するために、Hibernateの第2レベルのキャッシュ(人気のあるエンティティとコレクション用)の有効化を開始しました。

2次キャッシュを有効にしてから、パフォーマンスが向上しました。ただし、ObjectNotFoundExceptionsも発生し始めています。

データベースがHibernateの下のテーブル行を削除しているため、ObjectNotFoundExceptionsが発生しているようです。たとえば、ParentHibernateを使用してを削除すると、データベーススキーマはON DELETE CASCADEすべてのChildエンティティに適用されます。これは明らかにHibernatesの知識がなくても発生するため、第2レベルのキャッシュを更新する(および削除されChildたエンティティを削除する)機会はありません。

この問題の解決策はON DELETE CASCADE、データベーススキーマから削除することです(ただし、FOREIGN KEYsは保持します)。代わりに、Child通常の削除SQLを使用して依存関係を削除するようにHibernateを構成する必要があります。これにより、Hibernateは第2レベルのキャッシュも更新します。いくつかの限られたテストでは、このアプローチが機能しているように見えることが示されています。

これについてコミュニティからのフィードバックをもらいたかったのです。私たちの問題に対する代替の(より良い?)解決策はありますか?他の人はこの状況にどのように対処しますか?ON DELETE CASCADE一般に、 Hibernateを使用してデータベーススキーマで使用する場合に考慮すべきトレードオフは何ですか?

ありがとう。

4

2 に答える 2

2

プログラムを介して常に削除する場合は、データベースから制約を取り除き、休止状態のオブジェクトにON DELETE CASCADEを指示して、関連する人の世話をします。

一方、Javaアプリで、場合によってはデータベースレベルでオブジェクトを削除しようとすると、奇妙なデータのぶら下がりが発生します。この場合、より複雑なアプローチを検討する必要があるかもしれません。これが当てはまるかどうかは明確ではなかったため、ここではこれ以上詳しく説明しません。

于 2010-06-21T18:15:44.120 に答える
1

データベースで使用している場合はON DELETE CASCADE、次のように休止状態を通知する必要があります。

@OnDelete(action = OnDeleteAction.CASCADE)

これはとは異なります

@OneToMany(cascade = CascadeType.ALL, orphanRemoval = true)

後者は、メモリ内の関係について何かをhibenrateに伝えています。1つ目は、データベースレベルでSQLステートメントの削除を最適化します。Hibernateは、DBが子の削除を処理していることを知る必要があります。

このメカニズムの適切な説明については、このサイトをご覧ください。

http://eddii.wordpress.com/2006/11/16/hibernate-on-deletecascade-performance/

そしてこの機能の開発者からのコメント:

http://www.mail-archive.com/hibernate-devel@lists.sourceforge.net/msg03801.html

于 2014-03-08T10:39:52.743 に答える