2010-12-02 6 views
5

を現在永続状態のオブジェクトに呼び出すときは、javax.persistence.EntityNotFoundExceptionを避けるより洗練された方法がありますか?私はオブジェクトを削除するために2つのクエリを作成する必要がある状況を回避しようとしています。現時点で私は不正行為をしています:Hibernate EntityManagerは例外なくエレガントに削除しますか?

void remove(String id) { 
    T model = entityManager.getReference(type, id); 
    entityManager.remove(model); 
} 

ただし、モデルが存在しない場合は例外が発生します。

void remove(String id) { 
    T model = retrieve(id); 
    if(model != null) 
     entityManager.remove(model); 
} 

しかし、それは(今のところはさておきキャッシュの概念を設定)2つのクエリを伴うだろう:

私ができる

+0

私は例外をキャッチするために投票します。人々が言うことにもかかわらず、太陽がJavaメインAPI自体をプログラムしたやり方では、何度も通常の実行中のtry-catchは絶対にうまくいきます。先日、 'ClassLoader.loadClass()'の294行目を見て、* very * coreクラスの予想される例外を試してみました。 –

+0

MySQLデータベースの追加クエリと同じように高速/高速の例外が発生する可能性が高いとします。 – Finbarr

+0

オブジェクト参照が便利な場合は、entityManager.contains(obj)を呼び出すだけです。falseを返した場合は、既に削除しています。 (これはIDを持っていなければ動作しませんし、別の永続コンテキストで削除した可能性もあります。その場合は、JPQLのdelete文が機能します。 – JesperSM

答えて

0

唯一の可能性は、DELETE句とWHERE句でクエリを使用することです。 JPAが削除するオブジェクトに対して@PreDeleteまたは@PostDelete操作を呼び出さないことを除いて、正常に動作します。とにかくそれを望んでいないと思うので、クエリーに行ってください。リスナーを呼び出す場合は、削除する前にオブジェクト(明らかに)をロードする必要があります。

0

エンティティを削除する前にselect count(*) from ENTITY where id = :idを実行し、そのエンティティがデータベースに存在するかどうかを確認できます。したがって、例外なく削除できます。 find()persist()remove()などの一般的なメソッドを持つ汎用DAOを使用している場合はcount(*)クエリをremove()メソッドに追加できます。

希望します。

関連する問題