[JPA & Hibernate] Transaction, Entity Manager, Persistence Context

원알렉스·2020년 8월 11일
0

JPA

목록 보기
7/16
post-thumbnail
post-custom-banner

깃허브 소스코드
Udemy 강의영상

@Transactional

해당 메소드를 트랜잭션으로 감싸줍니다. 해당 메소드가 실행중에 오류 발생시 모든 변경 사항들을 롤백 해줍니다. 모든 변경 사항은 끝까지 정상적으로 실행되고 난 후에 마지막에 데이터베이스에 반영합니다. 그 전에 변경 사항을 반영하려 한다면 entityManager.flush()를 사용하면 됩니다.

Persistence Context(=Session)

현재 트랜잭션이 관리 중인 모든 엔티티를 저장하는 공간입니다. 트랜잭션이 시작할 때 생성되고 트랜잭션이 끝날 때 제거가 됩니다.

@Test
@Transactional  // Persistence Context
public void transactionalTest() {
    // Create Persistence Context

    // Database Operation 1 - Retrieve student
    Student student = entityManager.find(Student.class, 20001L);
    // Persistence Context(student)

    // Database Operation 2 - Retrieve passport
    Passport passport = student.getPassport();
    // Persistence Context(student, passport)

    // Database Operation 3 - Update passport
    passport.setNumber("U98989");
    // Persistence Context(student, passport++)

    // Database Operation 4 - Update student
    student.setName("Alex - updated");
    // Persistence Context(student++, passport++)

    // Persist to Database

    // Kill Persistence Context
}

만약에 @Transactional 어노테이션이 없을 경우, Entity Manager의 연산(Database Operation 1)이 끝날 경우 트랜잭션이 종료되므로 Database Operation 2에서 해당 객체를 참조 할때 에러가 발생하게 됩니다. 즉, read-only 메소드에서 해당 객체와 연관 관계인 객체를 참조할 경우에도 @Transactional 어노테이션을 적용해줘야 합니다.

profile
Alex's Develog 🤔
post-custom-banner

0개의 댓글