0

JCS キャッシュを使用し、エンティティを正常に配置しました。JCS キャッシュからデータを取得すると、エンティティを取得できますが、1 対多の関係エンティティがある場合、関連するエンティティを取得できません。遅延初期化エクスプションを取得しています。ご提案ください。

4

2 に答える 2

0

データを JCS キャッシュに入れる前に、関連するエンティティを取得します。

于 2013-11-13T10:20:32.163 に答える
0

エンティティで ORM 以外のキャッシング メカニズムを使用すると、このような問題が発生しやすくなるため、注意が必要です。基本的に、キャッシュに追加されたオブジェクトは、キャッシュから取得する他のプロセスが必要とする範囲で初期化されていることを確認する必要があります。

私は慣れていませんが、JCSCache を使用していますが、Spring のキャッシングの抽象化を例として使用しています。

private CustomerService{
    @Cacheable
    public Customer loadCustomer(long id){

    /*if cache contains item with Key id this
     *is not called and therefore no session is 
     *open when the view is rendered.
     */
    customerDao.findById(id);  
    }
}

たとえば、注文のコレクションを持つ Customer があるとします。

プロセスがあります:

  • 顧客概要画面(名前、住所など)を表示します。
  • 顧客エンティティが取得され、何らかのメカニズムによって (非 JPA) キャッシュに追加されます。
  • 概要画面は注文に触れないため、コレクションは初期化されません (Lazy マッピングを想定)

プロセス2があります:

  • お客様の注文履歴を表示
  • 上記の [1] と同じメソッドを呼び出して、Customer を取得します。
  • OSIV パターンを使用しているため、キャッシュせずにセッションを開いたままにし、注文をオンデマンドでフェッチします。
  • ただし、キャッシュを使用すると、キャッシュ マネージャーはこのエンティティがキャッシュされていることを検出し、プロセス [1] で作成された部分的に初期化されたキャッシュされたインスタンスを返します。
  • セッションが開かれることはなく、キャッシュされた遅延注文の関連付けにアクセスしようとすると例外が発生します。

そのため、キャッシュされたインスタンスが完全に初期化されていることを確認するか、セッションが再開される DAO 層にキャッシュをシフトするか、何らかの方法でサービス レイヤーでキャッシュ ロード イベントをインターセプトして、切り離されたオブジェクトを再アタッチする必要があります。

于 2013-11-13T11:35:32.870 に答える