복붙노트

[SPRING] @Transactional이 데이터베이스에 자동으로 저장되는 이유는 무엇입니까?

SPRING

@Transactional이 데이터베이스에 자동으로 저장되는 이유는 무엇입니까?

@Transactional 주석이 달린 메소드가 있습니다. 내 DB에서 개체를 검색하고 필드를 변경 한 다음 메서드에서 반환합니다. 내 개체를 저장하지 않고 데이터베이스가 어쨌든 이상하게 업데이트됩니다.

이 문제를 피하는 방법을 알려주십시오.

해결법

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

    1.이 동작은 트랜잭션 성의 주요 목적 중 하나입니다.

    이 동작은 트랜잭션 성의 주요 목적 중 하나입니다.

    트랜잭션 방식이 반환되기 전에 트랜잭션이 커밋됩니다. 즉, 관리 대상 엔티티에 대한 모든 변경 사항이 데이터베이스로 플러시됩니다.

    오류가 발생하면 트랜잭션이 롤백됩니다. 이는 변경 사항이 데이터베이스에 커밋되지 않음을 의미합니다.

    느린로드 된 속성 (엔티티의 콜렉션)에 액세스하려고하면 LazyInitializationException이 표시됩니다. DB에서 entitiy를 가져올 때 lazily loded 속성이 인스턴스화되지 않습니다.

    트랜잭션에서 지연로드 된 속성에 액세스하는 경우 지속성 공급자는 쿼리를 만들고 결과를 인스턴스화 한 다음 '상위'엔터티에 연결합니다.

    편집 : 게으른 속성을로드하고 DB에 유지되는 변경하지 않고 엔터티를 변경할 수있게하려면 지연 속성에 대한 페치 조인을 사용하여 엔터티를 페치 할 수 있습니다.

    em.createQuery("SELECT e FROM MyEntity e JOIN FETCH e.lazyProp");
    

    그런 다음 @orid에 설명 된 방법 중 하나를 진행하십시오.

    페치 조인을 사용하지 않는 경우 트랜잭션 내부에서 지연로드 된 속성에 액세스해야합니다.

    myEntity.getLazyProp().size();
    

    size ()에 대한 호출에 유의하십시오. getter를 호출하면 프록시를 얻을 수있을만큼 충분하지 않습니다. 속성의 실제 데이터가 필요한 작업을 수행해야합니다.

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

    2.이것은 정상적인 JPA 동작입니다.

    이것은 정상적인 JPA 동작입니다.

    find ()를 통해 객체를 검색하면 그 객체는 첨부 된 것으로 간주되거나 영속 컨텍스트에 속합니다. 이 메소드를 종료하면 @Transactional이 모든 "더티 (dirty)"객체를 데이터베이스로 플러시하고 트랜잭션을 커밋하는 Spring 트랜잭션 관리 측면을 트리거합니다. 오브젝트가 지속성 컨텍스트와 트랜잭션 컨텍스트 내에서 이미 변경되었으므로 변경 사항은 명시 적으로 save 메소드를 호출 할 필요없이 데이터베이스에 저장됩니다.

    데이터베이스에 영향을주지 않고 개체를 변경하려면 두 가지 옵션이 있습니다.

  3. from https://stackoverflow.com/questions/21552483/why-does-transactional-save-automatically-to-database by cc-by-sa and MIT license