SpringBoot JPA怠惰ロードの問題---No session

2430 ワード

現在のプロジェクトで使用されているormフレームワークはJPAであり、その使用されている実装クラスはHibernateに基づいている.
問題の説明:コードロジックは大体次の通りです.
  public class EntiryA{
       int a;
       int b;
       String c;
      @OneToMany(cascade = CascadeType.ALL, mappedBy = "Property", fetch = FetchType.LAZY)
       EntityB entityb;
  }
   class ServiceA{
          public Object functionA(){
                   Object   a = repository.findById(id);
                   for(){
                         serviceB.functionB(); 
                  }
   }
   class ServiceB{
          @Transactional(rollbackFor = Exception.class)
          public Object functionB()throws Exception {
                    do somthing.......
            }
   }

functionAでループ処理を行うため、物事の注釈を付けず、functionBでは複数のデータベース操作があり、一貫性を保つために、物事のロールバックを加えた.
具体的な質問:functionBで異常ロールバックが発生した場合、EntiryAオブジェクトで怠惰ロードされたentitybのデータが正常に取得できません.異常は「could not initialize proxy-no session」です.明らかに、データベース・セッションsessionのクローズによる怠惰なロードが正常にデータを取得できない.
なぜ現れたのかについては、多くの科学ポスターがあるので、私も繰り返しませんが、これを参考にしてください.https://blog.csdn.net/johnf_nash/article/details/80658626; 直感的な現象から,この問題が発生した原因はfunctionBに異常が発生し,ロールバック処理が起こりsessionが閉じたことにあると推定した.
私が分からないのはfunctionAには物事がなく、本当のものはfunctionBの中にある.データのクエリーはfunctionAで生成され、物事のないfunctionAに対しては、通常、クエリーが完了するとこのデータベース操作は終了するはずであり、sessionも中断され、functionAの永続化コンテキストはどのように維持されているのか、あるいはどのように生成されているのか、またfunctionBで作成された永続化コンテキストはfunctionAとどのように関連しているのでしょうか.
3編の博文を見れば大部分を説明できるはずだ.https://www.cnblogs.com/wangyonglong/p/5178450.html https://blog.csdn.net/opnmzxcvb/article/details/4586452 https://blog.csdn.net/wongtseng/article/details/1730948
つまりspring bootにはspringが自動的に追加されます.jpa.Open-in-view=true構成です.彼は私に永続化コンテキストを生成するのを助けてくれます.この構成により、JPAの永続化コンテキストEntityManagerは複数の物事にまたがり、sessionの周期を延長し、request要求の処理スレッドごとに1つのsessionを関連付けることができます.新しいものを作成すると、現在の処理スレッドにデータベースsessionがないことが判明すると、新しいものが作成され、すでに存在する場合は既存のsessionが取得されるため、functionBのsessionはfunctionAと同じものを使用し、functionBのロールバックによってsessionが閉じられると、怠惰なロードでデータベースに再接続してデータを取得できなくなります.
しかし、functionBのロールバックによって作成されたSessionがオフになり、正常にコミットされると、怠惰なロードデータの使用が継続できるのはなぜなのかという疑問も出ています.テストでは、怠惰なロードオブジェクトに関連付けられたSessionオブジェクトは空ではなく、同じsessionオブジェクトであり、設定された物事の伝播プロパティがPROPAGATIONであっても、REQUIRES_NEWなので、リラウドされたオブジェクトの内容を取得することができますが、例外を投げ出してロールバックが発生すると、初めて作成したセッションオブジェクトが閉じてしまい、スレッド全体のセッションも存在せず、外層関数は内部に物事を含む関数と1つのセッションを共用し、同様に存在しないため、リラウド関連のセッションも存在しません.そのため、no session異常を引き起こした.この文章を読んでいる皆さんがもっと良い解釈があれば、共有を歓迎します.