Home 준영속 상태
Post
Cancel

준영속 상태

준영속 상태

영속성 컨테스트가 관리하는 영속 상태의 엔티티가 영속성 컨텍스트에서 분리된(detached) 것을 준영속 상태라 한다. 따라서 준영속 상태가 된 엔티티는 영속성 컨텍스트가 제공하는 기능을 사용할 수 없게된다.

준영속 상태 만들기

영속 상태의 엔티티를 준영속 상태로 만드는 방법은 크게 3가지가 있다.

  • em.detach(entity): 특정 엔티티만 준영속 상태로 전환
  • em.clear(): 영속성 컨텍스트를 완전히 초기화
  • em.close(): 영속성 컨텍스트를 종료

em.detach()

em.detach() 메소드는 특정 엔티티를 준영속 상태로 만든다.

1
2
3
4
5
6
7
8
9
10
11
12
13
class Test() {
    public void detachTest() {
        Member member = new Member();
        member.setId("memberA");
        member.setUsername("회원A");

        //영속 상태
        em.persist(member);

        //준영속 상태
        em.detach(member);
    }
}

em.detach()를 호출하게 되면 영속성 컨텍스트가 더는 해당 엔티티를 관리하지 않게되고 1차 캐시부터 쓰기 지연 SQL 저장소까지 해당 엔티티를 관리하기 위한 모든 정보가 제거된다.

em.clear()

em.detach()가 특정 엔티티만을 준영속 상태로 만든다면 em.clear는 영속성 컨텍스트를 초기화 하여 해당 영속성 컨텍스트가 관리하던 모든 엔티티를 준영속 상태로 만든다.

1
2
3
4
5
6
7
8
9
10
11
12
13
class Test() {
    public void clearTest() {
        Member member = new Member();
        member.setId("memberA");
        member.setUsername("회원A");

        //영속 상태
        em.persist(member);

        //준영속 상태
        em.clear();
    }
}

이 경우는 영속성 컨텍스트를 초기화 하기 때문에 1차 캐시와 쓰기 지연 SQL 저장소에 있는 모든 영속 상태의 엔티티 정보를 제거한다.

em.close()

영속성 컨텍스트를 종료하면 해당 영속성 컨텍스트가 관리하던 영속 상태의 엔티티가 모두 준영속 상태가 된다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class Test() {
    public void closeEntityManager() {
        EntityManagerFactory emf = Persistence.createEntityManagerFactory("jpaTest");

        EntityManager em = emf.createEntityManager();
        EntityTransaction transaction = em.getTransaction();

        transaction.begin(); // [트랜잭션] - 시작

        Member memberA = em.find(Member.class, "memberA");
        Member memberB = em.find(Member.class, "memberB");

        transaction.commit(); // [트랜잭션] - 종료

        em.close(); // 영속성 컨텍스트 종료
    }
}

영속 상태의 엔티티는 주로 영속성 컨텍스트가 종료되면서 준영속 상태가 된다. 개발자가 직접 준영속 상태로 만드는 일은 드물다.

준영속 상태의 특징

거의 비영속 상태에 가깝다

영속성 컨텍스트가 관리하지 않으므로 1차 캐시, 쓰기 지연, 변경 감지, 지연 로딩을 포함한 영속성 컨텍스트가 제공하는 어떠한 기능도 동작하지 않는다.

식별자 값을 가지고 있다

비영속 상태는 식별자 값이 없을 수도 있지만 준영속 상태는 이미 한번 영속 상태였으므로 반드시 식별자 값을 가지고 있다.

지연 로딩을 할 수 없다

준영속 상태는 영속성 컨텍스트가 더는 관리하지 않으므로 지연 로딩 시 문제가 발생한다.

참고

This post is licensed under CC BY 4.0 by the author.

플러시

병합(Merge)

Comments powered by Disqus.