2

こんにちは、問題が発生しています。私の (推測している) 永続化レイヤーが結果をキャッシュしているため、アプリケーションの外部からデータベースを更新すると、データが古いままになります。

ただし、半分の時間しかキャッシュしていません。これが理にかなっていることを願っています。

クラスがあります

@Entity
@Table(name = "PROVINCE")
public class Province implements Serializable {

@Id
@GeneratedValue
int id;

String provinceName;

String provinceMoto;


Buildings buildings;


Units units;


Person person;

.... etc

これで、'provincename' などのクラス オブジェクトへの参照ではないデータを更新すると、そのデータはアプリケーションで問題なく、すぐに更新されます。ただし、「建物」などの内部オブジェクトはそうではなく、アプリを再デプロイするなどのハード リフレッシュを行うと、データが新鮮になります。

私はここのデータベースから私の州を取得します:

Query query = manager.createQuery("select p from Province p where p.person = :query");
        query.setHint("toplink.refresh", "true");
        query.setParameter("query", p);

        province = (Province) query.getSingleResult();

では、そのクラスの内部オブジェクト、つまり「建物」「人」も更新するように強制するにはどうすればよいでしょうか。

私の永続層はトップリンクの必需品であり、データが更新されないという以前の問題を修正しました。そして、その最初の投稿はこちらです(別のスタックオーバーフローページです)

助けてくれてありがとう。私の問題を十分に説明したことを願っています

[編集: このフレームワークを使用していない場合と同様に、データベース内のテーブルを結合して新しい変数にデータを再入力する方が簡単ですが、そうではありません]

4

2 に答える 2

2

これは「ドク、私が…すると痛い」「そうしないでください」という質問です。

Toplink の背後でデータベースを更新している場合は、同じようにデータを更新する必要があります。

JPAで「select」タイプのクエリを使用するたびに、データベースにヒットします。しかし、おわかりのように、関連するオブジェクトの場合は、単に DB からキーを取得し、データベースにアクセスするよりもキャッシュされたバージョンを優先して使用します。

Toplink には 2 つのキャッシュがあります。レベル 1 およびレベル 2 キャッシュ。レベル 1 キャッシュは、現在のセッションで使用されるトランザクション ベースのキャッシュです。レベル 2 キャッシュも同様ですが、適用範囲はアプリケーション全体でグローバルです。レベル 2 キャッシュは、遭遇する可能性が最も高いものです。

そのため、Toplink のリフレッシュ ヒントを引き続き使用するか、レベル 2 キャッシュを完全に無効にする必要があります。

于 2011-03-22T05:56:35.217 に答える
0

データを DB に更新した後、値オブジェクト (子値オブジェクトも) またはフォームをデフォルト値で再初期化します。これがあなたの問題を解決することを願っています。

于 2011-03-22T05:34:48.297 に答える