"인프런 - 자바 ORM 표준 JPA 프로그래밍 강의를 듣고 작성한 글 입니다."
www.inflearn.com/course/ORM-JPA-Basic#
자바 ORM 표준 JPA 프로그래밍 - 기본편 - 인프런
JPA를 처음 접하거나, 실무에서 JPA를 사용하지만 기본 이론이 부족하신 분들이 JPA의 기본 이론을 탄탄하게 학습해서 초보자도 실무에서 자신있게 JPA를 사용할 수 있습니다. 초급 웹 개발 프로그
www.inflearn.com
entity 가 영속 상태가 될 수 있는 방법은 persist 메소드를 호출하는 것 말고 다른 하나가 더 존재한다.
find() 메소드를 통해 데이터베이스에서 데이터를 가져왔는데, 해당 데이터가 영속성 컨텍스트에 존재하지 않는 경우, 즉 1차 캐시에 찾아온 데이터가 존재하지 않는 경우 해당 데이터를 1차 캐시에 올림으로서 영속 상태로 만들 수 있다.
(1차 캐시에 올라간 상태가 바로 영속 상태이다. -> JPA 가 관리하고 있는 상태)
-> persist() 메소드를 호출해도 entity 를 영속상태로 만들 수 있지만, find() 메소드를 통해 entity 를 데이터베이스에 조회하여 해당 entity 를 반환받아도 해당 데이터가 영속성 컨텍스트에 없으면 데이터를 영속성 컨텍스트(1차 캐시)에 올리면서 영속 상태로 만들 수 있다.
그렇다면 준영속 상태는 무엇일까?
준영속 상태는 영속 상태의 entity 가 영속성 컨텍스트 에서 분리(detached)되는 것으로(1차 캐시에서 빠져나가는 것)
영속성 컨텍스트가 제공하는 기능, 즉 entity 변경과 같은 Dirty Checking 기능 등을 사용할 수 없게 된다.
- entity 를 준영속 상태로 만드는 방법
영속성 컨텍스트에 올라와 있는 객체에 대하여 실행 할 수 있다.
em.detach(entity) 메소드 : 특정 entity 만 준영속 상태로 전환한다.
-> 객체를 영속성 컨텍스트에서 분리시킨다. 해당 트랜잭션에서 영속성 컨텍스트에 올라와 있는 객체에 대해 변경작업이 있었다고 해도 커밋하기 전에 detach 메소드를 통해 해당 객체를 준영속 상태로 만들어버리면 해당 객체는 더 이상 JPA 가 관리하지 않게 되므로 Dirty Checking 과 같은 기능이 실행 될 수 없다.
즉, 데이터의 변경이 일어나지 않는다.
// 준영속 상태로 만들기
Member member = em.find(Member.class, 150L); // 영속성 컨텍스트에 값을 올림
member.setName("AAAA"); // Dirty Checking 을 통한 변경
em.detach(member); // 영속성 컨텍스트에서 빼버림으로서 준영속 상태로 전환
// JPA 가 더 이상 해당 객체를 관리하지 않음
// 커밋을 해도 update query 가 나오지 않는다.(즉, 데이터의 변경이 일어나지 않는다.)
그외 entity 를 준영속 상태로 만드는 방법
em.clear() 메소드 : 영속성 컨텍스트를 완전히 초기화 시킨다.(1차 캐시에 올라와 있는 entity 들을 모두 날려버린다.)
em.close() 메소드 : 영속성 컨텍스트를 종료시킨다.
'JPA' 카테고리의 다른 글
필드와 컬럼 매핑 - 1 (0) | 2020.09.19 |
---|---|
객체와 테이블 간 Entity 매핑 (0) | 2020.09.19 |
플러시(flush) 에 대하여... (0) | 2020.09.11 |
영속성 컨텍스트의 이점 - 변경 감지, 엔티티 삭제 (0) | 2020.09.09 |
영속성 컨텍스트의 이점 - 동일성 비교와 트랜잭션 쓰기 지연 (0) | 2020.09.09 |