[SPRING] @Transactional이 데이터베이스에 자동으로 저장되는 이유는 무엇입니까?
SPRING@Transactional이 데이터베이스에 자동으로 저장되는 이유는 무엇입니까?
@Transactional 주석이 달린 메소드가 있습니다. 내 DB에서 개체를 검색하고 필드를 변경 한 다음 메서드에서 반환합니다. 내 개체를 저장하지 않고 데이터베이스가 어쨌든 이상하게 업데이트됩니다.
이 문제를 피하는 방법을 알려주십시오.
해결법
-
==============================
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.이것은 정상적인 JPA 동작입니다.
이것은 정상적인 JPA 동작입니다.
find ()를 통해 객체를 검색하면 그 객체는 첨부 된 것으로 간주되거나 영속 컨텍스트에 속합니다. 이 메소드를 종료하면 @Transactional이 모든 "더티 (dirty)"객체를 데이터베이스로 플러시하고 트랜잭션을 커밋하는 Spring 트랜잭션 관리 측면을 트리거합니다. 오브젝트가 지속성 컨텍스트와 트랜잭션 컨텍스트 내에서 이미 변경되었으므로 변경 사항은 명시 적으로 save 메소드를 호출 할 필요없이 데이터베이스에 저장됩니다.
데이터베이스에 영향을주지 않고 개체를 변경하려면 두 가지 옵션이 있습니다.
from https://stackoverflow.com/questions/21552483/why-does-transactional-save-automatically-to-database by cc-by-sa and MIT license
'SPRING' 카테고리의 다른 글
[SPRING] 클래스 수준 변수에서 Spring @Value 주석을 사용하는 방법 (0) | 2019.03.14 |
---|---|
[SPRING] <jar-file>을 검사하는 동안 오류가 발생하여 entityManagerFactory를 만드는 동안 오류가 발생했습니다. (0) | 2019.03.14 |
[SPRING] Spring 임베디드 데이터베이스는 다른 SQL 언어를 지원합니까? (0) | 2019.03.14 |
[SPRING] Jersey와 함께 Jackson ObjectMapper 사용하기 (0) | 2019.03.14 |
[SPRING] StaleObjectstateException 행이에 의해 업데이트되거나 삭제되었습니다. (0) | 2019.03.14 |