2016-09-25 50 views
0

我使用jHipster彈簧數據JPA和有下面的方法:獲取LazyInitializationException中儘管使用@Transactional(傳播= 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); 
} 

在最後的線I得到一個org.hibernate.LazyInitializationException excption其我不明白。

  • 雖然該方法在自己的事務中運行,但它爲什麼會拋出這個咒語?
  • 它不應該只是延遲加載列表,因爲會話仍然打開?
+0

爲什麼使用REQUIRES_NEW? –

+0

我使用REQUIRE_NEW,因爲此方法是從循環中的另一個類中調用的,並且我希望在每次迭代後實體都得到保持。如果一個事務在循環中失敗,我希望以前的迭代已經持續。 – Thailer

回答

1

可能是LazyInitializationException被拋出,因爲一個新的事務被啓動並且entityA變成了「分離」的結果。

人們可以使用這樣的事情:

@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); 
    } 
} 

它,你每次entityA加載,雖然是真實的。

+0

Thx很多,你把我帶到了正確的軌道。由於EntityA被傳遞給這個事務性方法,但是在外部獲取它會被分離。因此,首先在交易方法內部獲取它解決了問題。 – Thailer

相關問題