2016-09-25 11 views
0

私は春データJPAjHipsterを使用して、次の方法があります。最後の行で(伝播= Propagation.REQUIRES_NEW)

@Transactional(propagation=Propagation.REQUIRES_NEW) 
public void doSomeWork(EntityA entityA) { 
    // some code 
    List<EntityB> entityBList = new ArrayList<EntityB>(); 
    entityBList.add(new EntityB()); 
    entityA.addAllEntityB(entityBList); 
} 

を私はorg.hibernate.LazyInitializationException excptionを取得していますわかりません。

  • このメソッドは独自のトランザクションで実行されますが、なぜこの例外は発生しますか?
  • セッションがまだ開いているので、リストを怠惰に読み込んではいけませんか?
+0

なぜREQUIRES_NEWを使用しますか? –

+0

私はREQUIRE_NEWを使用します。このメソッドはループ内の別のクラスから呼び出され、エンティティが永続化されるたびに繰り返します。ループ内で1つのトランザクションが失敗した場合は、以前の反復をすでに保持しておきたい。 – Thailer

答えて

1

新しいトランザクションが開始され、entityAが結果として「デタッチ」されるため、LazyInitializationExceptionがスローされることがあります。このように外部から

@Transactional 
public void addEntityB(long entityAId, entityB) { 
    EntityA entityA = loadEntityA(entityAId); 
    addEntityBToEntityA(entityA, entityB); 
    saveEntity(entityB); 
} 

と呼ば:

一つは、このようなものを使用することができます

for (EntityB entityB : entityBList) { 
    try { 
    addEntityB(entityAId, entityB); 
    } 
    catch(Exception e){ 
    log(e); 
    } 
} 

あなたがが、毎回エンティティAをロードすることは事実です。

+0

Thxたくさん、あなたは私を正しい道に連れて来ました。 EntityAはこのトランザクションメソッドに渡されますが、外部にフェッチされると、デタッチされます。したがって、トランザクションメソッド内で最初にフェッチすることで問題が解決されました。 – Thailer