2016-09-25 3 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를 사용하기 때문에이 메서드는 루프의 다른 클래스에서 호출되므로 각 반복 후에 엔티티가 유지됩니다. 루프에서 하나의 트랜잭션이 실패하는 경우 이전 반복을 이미 유지하려고합니다. – Thailer

답변

1

새 트랜잭션이 시작되고 그 결과로 entityA가 "detached"될 것이므로 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); 
    } 
} 

당신이 생각마다 entityA를로드하는 것이 사실이다.

+0

많은 Thx, 당신은 나를 바른 길로 인도했다. EntityA가이 트랜잭션 방식으로 전달되었으므로 외부로 가져 오면 분리됩니다. 따라서 트랜잭션 방식에서 먼저 가져 와서 문제를 해결했습니다. – Thailer