복붙노트

[SPRING] JPA / JTA / @ Transactional Spring 주석

SPRING

JPA / JTA / @ Transactional Spring 주석

Spring 프레임 워크를 사용하여 트랜잭션 관리를 읽는다. 첫 번째 조합에서는 Spring + hiberante를 사용하고 Hibernate의 API를 사용하여 트랜잭션을 제어했습니다 (Hibenate API). 다음으로 @Transactional 주석을 사용하여 테스트하고 싶었지만 제대로 작동했습니다.

나는 혼란스러워지고있다 :

나는 나의 의심을 분명히하기 위해 온라인으로 읽지 만, 나는 직접적인 대답을 얻지 못한다. 모든 입력은 큰 도움이 될 것입니다.

해결법

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

    1.@ JPA를 사용하는 Spring-> Hibernate의 경우 트랜잭션

    @ JPA를 사용하는 Spring-> Hibernate의 경우 트랜잭션

    @ Transactional Annotations는 분리 할 수없는 모든 작업 주위에 배치해야합니다.

    예를 들어 보겠습니다.

    두 모델, 즉 국가 및 도시가 있습니다. 국가와 도시 모델의 관계형 매핑은 마치 하나의 국가가 여러 도시를 가질 수 있으므로 매핑이 비슷하기 때문에,

    @OneToMany(fetch = FetchType.LAZY, mappedBy="country")
    private Set<City> cities;
    

    이 곳은 게으른 사람들과 함께 여러 도시로 매핑되어 있습니다. 그래서 우리가 데이터베이스에서 Country 객체를 가져올 때 @Transactinal의 역할이옵니다. 그런 다음 Country 객체의 모든 데이터를 가져 오지만 LAZILY 도시를 가져 오기 때문에 도시 집합을 가져 오지 못합니다.

    //Without @Transactional
    public Country getCountry(){
       Country country = countryRepository.getCountry();
       //After getting Country Object connection between countryRepository and database is Closed 
    }
    

    우리가 국가 객체로부터 도시 집합에 접근하기를 원할 때 Set의 객체가이 객체를 초기화하기 위해 초기화되지 않기 때문에 Set에 null 값을 가져올 것입니다 Set의 값을 얻기 위해 @Transactional 즉,

    //with @Transactional
    @Transactional
    public Country getCountry(){
       Country country = countryRepository.getCountry();
       //below when we initialize cities using object country so that directly communicate with database and retrieve all cities from database this happens just because of @Transactinal
       Object object = country.getCities().size();   
    }
    

    기본적으로 @Transactional은 하나의 트랜잭션으로 여러 개의 통화를 할 수 있습니다.

    희망이 당신에게 도움이 될 것입니다.

  2. from https://stackoverflow.com/questions/26611173/jpa-jta-transactional-spring-annotation by cc-by-sa and MIT license