0

これはシーケンスです:

  1. App1: ID=1 のデータベースにエンティティを永続化します。問題ない。
  2. App2: 外部アプリケーションは、ID=1 の同じレコードを削除します。問題ない。
  3. App1: 前に App2 によって削除されたエンティティを再度永続化しようとします。ここでは、レコードがまだデータベースにあるかのように、"IntegrityConstraintViolation" という例外をスローし、2 回挿入していますが、そうではありません。

問題は、EntityManager がキャッシュを使用してデータベースの整合性を検証していることです。そして、どういうわけか、私が電話した後も

getEM().getEntityManagerFactory().getCache().evictAll(); or getEM().clear();

EntityManager は何らかの形でそのレコードをキャッシュに保持しており、そのキャッシュをクリアする方法についてのアイデアが不足しています。私が見つけた 1 つの回避策は、App1 から呼び出すことでした。

getEM().remove(entity.class, id);

また、データベースと EntityManager キャッシュからもレコードを効果的に削除します。しかし、これはポイントではありません。検証のためにキャッシュを使用していることを証明するだけですが、「別のアプリケーションから削除された後、レコードを再度保持できない」という主な問題は解決しません。

ところで、私もエンティティを更新しようとしましたが、どちらも機能しません。エンティティが管理されていないという例外がスローされます。

誰でもこれを解決する方法について何か考えがありますか?

4

2 に答える 2

1

App2 はトランザクションをコミットしますか?

IntegrityConstraintViolation はデータベースからスローされるため、古い行がまだデータベースに存在することを意味します。

ロギングを有効にして、2 つのアプリのログと完全な例外スタック トレースを含めます。

一般に、オブジェクトの生まれ変わりは通常は良い考えではありません。新しいIDで新しいオブジェクトを作成するか、少なくとも古いオブジェクトにデタッチ/コピーすることをお勧めします。

別のアプリケーションが同じデータベースにアクセスしている場合は、キャッシュを無効にすることを検討してください。

http://wiki.eclipse.org/EclipseLink/FAQ/How_to_disable_the_shared_cache%3F

それ以外の場合、この 1 つのオブジェクトのキャッシュを更新するだけの場合は、最初に find() を呼び出してオブジェクトが管理されていることを確認してから、refresh() を呼び出して共有キャッシュから削除します。(次に、それを detach() するか、EntityManager を clear() するか、新しいものを作成する必要があります)。

于 2013-06-26T13:59:46.570 に答える
0

最終的に状況を解決しました。このバージョンの EclipseLink 2.5 は、以前のバージョンとは少し異なる動作をします。これが違いの 1 つです。問題は、TestClass の 'tearDown()' メソッドで次の行を実行していたことです。

em.CreateQuery("delete from mytable").executeUpdate();

データベース内のテーブルをクリーンアップします。この行がデータベースからレコードを効果的に削除する場合でも、同じ EntityManager を使用している場合は、何をしてもキャッシュから削除されません。そのため、クエリを移動し、mytable Entity クラスに @NamedQuery アノテーションを作成しSQLを直接実行する代わりに NamedQuery を呼び出しました。したがって、「tearDown()」メソッドの私のコードは次のようになりました。

em.CreateNamedQuery("emptyMyTableQuery").executeUpdate();

そして @NamedQuery:

@NamedQuery(name="emptyMyTableQuery", query="delete from mytable")

今では完全に機能します。

正直なところ、EclipseLink の以前のバージョンではこれが発生しませんでしたが、この新しいバージョン 2.5 にはいくつかの面でいくつかの拡張機能と改善があり、いくつかのバグも修正されていると言わざるを得ません。まあ、誰かが同じ問題を見つけたら、これが役立つことを願っています.

于 2013-06-27T02:53:13.260 に答える