2011-08-22 18 views
6

エンティティへの参照をすべて削除することはきわめて困難です(またはパフォーマンス上の問題)。JPAで「エンティティが見つかりません」というエラーが発生しました

たとえば、別のPersonオブジェクトとの関係を持つPersonオブジェクトがあります。

Personを削除すると、このPersonオブジェクトが参照されている場所がわからないことがあるため、このPersonをすべてのリレーションで削除する必要はありません。したがって、すべての参照を削除する場合は、パフォーマンス上の問題が発生する可能性のある余分なSQL作業を行う必要があります。

理想的な世界で私はPersonオブジェクトを削除したいと思います。別のPersonが(関係にIDを持つため)このPersonへの参照を行うと、nullを返します。

事実は、JPAは

javax.persistence.EntityNotFoundException: No row with the given identifier exists 

が、この場合のnull参照ではなく、例外を返すためにJPAを強制する方法があることを不平を言うのですか?

答えて

16

NotFoundAction.IGNOREの値を持つ@NotFound注釈を使用できます。関連付けられたエンティティが存在しない場合は、nullが返されます。

これはコレクション内でこれを使用し、エントリが見つからない場合、コレクションにnull値を追加します。これは非常に面倒です。これを避けるには、nullをスキップするコレクションにコレクションをラップすることができます。

+0

これはまさに私が探していたものでした。どうもありがとうございます。これは休止状態に特化したものでしょうか? –

+1

私はそれが助けてくれてうれしく思います、注釈は休止状態になっています – Augusto

+0

@AugustoなぜSpringデータがこの例外を最初に投げているのですか? – svlada

5

いや、少なくとも何も標準(JPA)

しかし、あなたはcascadeはOT @*ToMany@*ToOne注釈を属性を使用してこれらの関連で何が起こるかを制御することができます。

0

@NotFound(action = NotFoundAction.IGNORE) これはヌルエンティティをスキップします。 あなたのプロパティの@NotFound(action = NotFoundAction.IGNORE)のために、例えばPrimefaces Datatableを使用して10行を取得して2をスキップした場合、 の場合、 は8行ではなく10行を持ちます実際にゴーストの行)。

関連する問題