私は、ハイバネートをECacheで設定した広範なデモアプリケーションを使用しています。私はまた、同じdbと直接対話している外部アプリケーションを持っています。 外部アプリケーションを使用してdbを更新すると、それらの変更を認識していない広範なアプリケーションは、新しいエンティティを作成する際に重複した主キーをスローします。私は休止状態を可能にする休止状態のキャッシュを一からクリアすることによってこの問題を解決しようとしています。 次のコードを使用して2番目のレベルのキャッシュをクリアしています。ハイバネートキャッシュをクリアできません
しかし、これは動作していないようです。
私はさらに、visualvmのようなJMXリスナーを使って手動でカフェをクリアしようとしました。しかし、これもうまくいきません。私はまだAPIの古いプライマリキーの値を取得しています。これは、第2レベルのキャッシュだけが第1レベルのキャッシュを残してクリアされているためですか?私はここで立ち往生している。誰でもこの問題を助けてくれますか? UPDATED
: はのは、私がアプリケーションとBがあるとしましょう。 Aはbroadleafを使用し、Bは生のSQLクエリを使用してdbに挿入します。私はアプリケーションAを使用していくつかの注文を作成し、次にアプリケーションBを使用してデータベースに直接いくつかの注文を挿入します(SEQUENCE_GENERATORテーブルをmax(order_id)+ 1で更新します)。その後、アプリケーションAを使用して注文を作成しようとすると、例外。 IdOverrideTableGeneratorがまだ私の古いプライマリキーを与えていることがわかった問題をデバッグしようとしました。これで2番目のレベルのキャッシュが不思議に思えました。ブロードリーフはプライマリキー生成の参照を開始するためにSEQUENCE_GENERATORを使用せず、キャッシュの現在の状態を維持しますか?私の場合、SEQUENCE_GENERATORを更新しても新鮮でユニークな主キーは保証されません。
max(order_id)アプローチは機能しません。 OrderImplのデフォルトの増分サイズは50です。アプリケーションBからレコードを挿入する前に、事前に(たとえば50件)のIDのバッチを予約する必要があります。これにより、アプリケーションAは、別のバッチを要求した場合にこれらのIDを使用しないことを保証し、アプリケーションBがアプリケーションAを実行しているインスタンスから現在予約されているIDを使用しないことを保証します。アプリBの予約が誤って共有されることはありません。 – mbvcomeback
注文を手動で挿入するためにデータベースに直接アクセスするのではなく、Broadleaf側にAPIエンドポイントを構築して、他のシステムからの注文をBroadleafの「注文」に変換して保存する方がはるかに良いパターンです。次に、2つのシステムをよりよく分離しながら、このsequence_generatorの問題全体を回避することができます。 – phillipuniverse
私はPhillipに同意します。設計要件が許せば、最善の方法は、注文情報を受け入れ、注文を維持するAPIエンドポイントを作成することです。 – mbvcomeback