1

アプリケーションが高速である必要があるため、毎回 findById を使用してデータベースでそれらを検索する必要がないように、いくつかの単純なエンティティ Bean (EJB 3.1、Glassfish、EclipseLink) のアプリケーション内キャッシュがあります。これらのエンティティ Bean は読み取り専用です。

たとえば、エンティティ Bean の Country または Currency はローカル キャッシュにあります。

上記の単純な Bean (Country、Currency...) を使用する複雑なエンティティ Bean (つまり、Customer) を更新する Java EE アプリケーションのプロセスが発生します。

次に何が起こるかというと、JPA コンテキストへの単純エンティティ Bean の接続が失われるため、Customer Bean で .merge() が試行されると、JPA は単純エンティティ Bean を新しいレコードとしてデータベースに保存しようとしますが、これらは存在します。すでにデータベースに 100% 含まれているため、これは「切り離されたエンティティ」の問題だと思います。

例。

Country country = getFromCacheByName("GB"); // detached entity, but exists in database
Customer customer = getCustomerFromJPA(); // existing JPA attached entity
customer.setCountry(country);
EntityManager.merge(customer); // pseudo code

依存オブジェクト (国) を .merge() に保存しようとしないように、最後の行または Bean (顧客) 自体を修正する方法は?

ありがとうございました。

4

1 に答える 1

1

Customer に設定する前に、国で find() または merge() を実行する必要があります。また、ID が正しいことを確認してください。

Merge on Customer も機能するはずですが、ID が存在する場合に国を挿入しようとするのは奇妙ですが、これは構成方法に依存する可能性があります。国の関係でマージをカスケードしていますか?

EclipseLink には独自のキャッシュがあることに注意してください。したがって、アプリケーション キャッシュはおそらく必要ありません。

于 2012-05-09T14:51:32.467 に答える