복붙노트

[SPRING] Spring의 트랜잭션 및 스트림

SPRING

Spring의 트랜잭션 및 스트림

왜이 코드가 작동하지 않는지 이해하려고 노력합니다.

구성 요소 :

@PostConstruct
public void runAtStart(){

    testStream();
}

@Transactional(readOnly = true)
public void testStream(){
    try(Stream<Person> top10ByFirstName = personRepository.findTop10ByFirstName("Tom")){
        top10ByFirstName.forEach(System.out::println);
    }
}

그리고 저장소 :

public interface PersonRepository extends JpaRepository<Person, Long> {
    Stream<Person> findTop10ByFirstName(String firstName);
}

나는 얻다:

해결법

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

    1.Spring에서 중요한 점 중 하나는 많은 주석 기능이 프록시를 사용하여 주석 기능을 제공한다는 점입니다. 즉, @Transactional, @Cacheable 및 @Async는 모두 해당 주석을 감지하고 해당 빈을 프록시 빈으로 래핑하는 Spring에 의존합니다.

    Spring에서 중요한 점 중 하나는 많은 주석 기능이 프록시를 사용하여 주석 기능을 제공한다는 점입니다. 즉, @Transactional, @Cacheable 및 @Async는 모두 해당 주석을 감지하고 해당 빈을 프록시 빈으로 래핑하는 Spring에 의존합니다.

    그렇기 때문에, 프록시 된 메소드는 클래스 내에서가 아니라 클래스 내에서 호출 될 때만 사용될 수 있습니다. 이 주제에 대해 알아보십시오.

    시험:

    시연하려면 (1) :

    public class MyOtherClass {
    
        @Autowired
        private MyTestStreamClass myTestStreamClass;
    
        @PostConstruct
        public void runAtStart(){
            // This will invoke the proxied interceptors for `@Transactional`
            myTestStreamClass.testStream();
        }
    
    }
    

    시연하려면 (2) :

    @Component
    public class MyTestStreamClass {
    
       @Autowired
       private MyTestStreamClass myTestStreamClass;
    
       @PostConstruct
       public void runAtStart(){
           // This will invoke the proxied interceptors for `@Transactional` since it's self-autowired
           myTestStreamClass.testStream();
       }
    
       @Transactional(readOnly = true)
       public void testStream(){
           try(Stream<Person> top10ByFirstName = personRepository.findTop10ByFirstName("Tom")){
                   top10ByFirstName.forEach(System.out::println);
               }
       }
    }
    
  2. from https://stackoverflow.com/questions/51922604/transactional-and-stream-in-spring by cc-by-sa and MIT license