복붙노트

[SPRING] @Transactional 메서드 내에서 LazyInitializationException 발생

SPRING

@Transactional 메서드 내에서 LazyInitializationException 발생

다음을 excecuting 할 때 지연된 예외를 액세스하려고하면 org.hibernate.LazyInitializationException 오류가 발생합니다.

@Transactional
public void displayAddresses()
{
     Person person = getPersonByID(1234);
     List<Address> addresses = person.getAddresses(); // Exception Thrown Here

     for(Address address : addresses)
          System.out.println(address.getFullAddress());
}

내 엔티티는 다음과 같습니다.

@Entity
@Table("PERSON_TBL")
public class Person
{
     ...

     @OneToMany(cascade=CascadeType.ALL, targetEntity=Address.class, mappedBy="person")
     private List<Address> addresses;

     ...
}

@Entity
@Table("ADDRESS_TBL")
public class Address
{
     ...

     @ManyToOne(targetEntity=Person.class)
     @JoinColumn(name="PERSON_ID", referencedColumnName="PERSON_ID")
     Person person;

     ...
}

내 displayAddresses () 메서드에서 @Transactional 주석을 사용하면 메서드가 완료 될 때까지 세션을 유지하게되어 지연로드 된 Address 컬렉션에 액세스 할 수있게되었습니다.

내가 놓친 게 있니?

편집하다

Tomasz의 조언에 따르면 : 내 displayAddresses () 메서드 내에서 TransactionSynchronizationManager.isActualTransactionActive () 상태가 false로 밝혀졌습니다.

그것은 문제의 범위를 좁히지 만, 왜 내 거래가이 시점에서 활성화되지 않을까요?

해결법

  1. ==============================

    1.이것은 이미 답변되었지만 비슷한 경우, 즉 미래 세대를 위해 나를 위해 일한 대안 답을 게시하고 싶었습니다.

    이것은 이미 답변되었지만 비슷한 경우, 즉 미래 세대를 위해 나를 위해 일한 대안 답을 게시하고 싶었습니다.

    필자의 경우이 문제는 lazy-loaded 콜렉션을 포함하고있는 인스턴스가 수동으로 축출 되었기 때문에 발생했다.

  2. ==============================

    2.설정 파일에 을 설정하고 Spring 서비스 버전 (displayAddresses () 메소드 호출)을 사용하여 트릭을 만들었다.

    설정 파일에 을 설정하고 Spring 서비스 버전 (displayAddresses () 메소드 호출)을 사용하여 트릭을 만들었다.

  3. from https://stackoverflow.com/questions/9318127/lazyinitializationexception-within-a-transactional-method by cc-by-sa and MIT license