2017-09-20 5 views
2

私のアプリケーションには、Ehcacheを実行するために提供されるモノリシックアプリケーションがあります。正しく動作します。キャッシュ設定がサービスメソッドであり、遅延ロードが真であることを知っておくことが重要ですDB.likeこのことから照会され、そのオブジェクトのすべて:クラスタ化されたアプリケーションでEhcacheが動作しない

@Transactional 
@Override 
@Caching(evict = { @CacheEvict(value = "schoolCache", key = "#school.id")}) 
public Integer save(School school) { 
     // Code here 
} 

Ehcacheの中に保存されているものは明らかであるが、school.Thereの怠惰なインスタンスでは、このようなモデルとのViewModelの間でデータを交換するためにコントローラ層でModelMapperです。

@RequestMapping(value = "/load/{Id}", method = RequestMethod.GET) 
@ResponseBody 
public SchoolViewModel load(@PathVariable Integer Id) { 
     SchoolViewModel schoolViewModel = ModelMapper.map(schoolService.loadByEntityId(Id), SchoolViewModel.class); 
     return schoolViewModel; 
    } 

SchoolVieの場合wModelには、ModelMapperのコントローラでDBから取得された、学校にあるオブジェクトの属性があります。 私はアプリケーションをクラスタ化し、EhcacheをRedisに設定します。
問題は何ですか?最初にSchoolServiceからのリクエストクエリー、DBからのこのサービスクエリー、およびhibernateのセッションが開いているので、ModelMapperはモデルをViewModelに正常にマッピングします.2回目は、最初にidと同じidで呼び出されたサービスメソッド時間はRedisのから学校オブジェクトを取得し、学校にあるオブジェクトの属性をマップするHiberante、ModelMapperのセッションが存在しないことはexception.The例外は、このようなものです取得します。org.hibernate:によって

を引き起こしました。 LazyInitializationException:プロキシ初期化できませんでした - org.hibernate.proxy.AbstractLazyInitializで org.hibernate.proxy.AbstractLazyInitializer.initialize(AbstractLazyInitializer.java:165)でノーセッション er.getImplementation org.hibernate.proxy.pojo.javassist.JavassistLazyInitializer.invoke(JavassistLazyInitializer.java:185)で(AbstractLazyInitializer.java:286) ので

私はどのように行うのですか?私を助ける最良の方法は何ですか? どうもありがとう

+0

Spring Cacheを使用しないでください。第2レベルのキャッシュを適切に行うために休止状態を構成します。 –

+0

他のアプリでは、どのように変化しているのでしょうか?アプリ1とアプリ2のオブジェクトの変更がそれを感じたら? –

+0

これはキャッシュの実装によって異なりますが、ほとんどはクラスタリング機能をサポートしています。これは、Hibernateが、異なるサーバ上で実行されている複数のJVMであってもそれらと連携できることを意味します。 EhcacheとInfinispanはどちらもそれをサポートしています。 BTWはさらにいくつかの問題を解決していますので、あなた自身でR&Dをやっていない限り、これを自分で行うようアドバイスすることはありません。 – Sanne

答えて

1

私はmy bookで説明したように、あなたはさらにサービスメソッドに必要なすべての関連付けを初期化する必要があります。

  1. あなたは:だから

    schoolService.loadByEntityId(Id), SchoolViewModel.class) 
    

    を、あなたは複数のオプションを持っていますJOIN FETCH with a JPQL queryを使用できます。

  2. またはHibernate.unproxy(proxy)を使用できます。
  3. LAZYの関連付けをナビゲートするだけです。
  4. DTO projectionを使用すると、LazyInitializationExceptionにぶつかることはありません。
関連する問題