JPA에서 Entity는 4가지의 생명주기를 가집니다.
비영속 (New / Transient)
Entity를 생성하고 아직 저장하지 않은 상태입니다.
따라서, 영속성 컨텍스트 혹은 데이터베이스와는 전혀 연관이 없는 상태입니다.
Member member1 = new Member();
member1.setId(1);
member1.setUserName("회원1");
영속 (Managed)
Entity Manager를 통해 Entity를 영속성 컨텍스트에 저장한 상태 혹은 저장된 Entity를 조회한 상태입니다.
영속성 컨텍스트가 관리하는 Entity를 이 영속 상태라고 합니다.
Member member2 = new Member();
member2.setId(2);
member2.setUserName("회원2");
// 저장
entityManager.persist(member2);
// 혹은 조회
member2 = entityManager.find(Member.class, 2);
준영속 (Detached)
영속성 컨텍스트가 관리하던 영속 상태의 Entity를 관리하지 않는 상태로 변경했을 때의 상태입니다.
// 위에서 영속 상태로 변경한 member2 객체를 준영속 상태로 변경한다.
entityManager.detach(member2);
// 혹은 영속성 컨텍스트를 닫을 때도 변경된다.
entityManager.close();
// 혹은 영속성 컨텍스트를 초기화할 때도 변경된다.
entityManager.clear();
사실 잘 이해가 가지 않아 더 찾아봤습니다.
아래와 같이 Entity의 식별자가 변경되거나, 트랜잭션 중 Detach되는 경우가 실무에서 그나마 발생할 것 같습니다. (사실 이럴 경우가 없을 것 같지만)
Member member3 = entityManager.find(Member.class, 3);
member3.setId(4); // 식별자가 영속성 컨텍스트에 없는 값으로 변경되므로 준영속 상태로 변경된다.
member3.setUserName("회원3변경");
Member member3 = entityManager.find(Member.class, 3);
member3.setUserName("회원3변경");
// 커밋 전 준영속 상태로 변경한다.
entityManager.detach(member3);
// 커밋 이후 UPDATE문이 발생하지 않는다.
transaction.commit();
병합 (merge)
준영속 상태의 Entity를 다시 영속 상태로 변경하려면 병합해야합니다.
병합은 비영속 상태의 Entity도 사용이 가능합니다.
// 영속 상태의 Entity
Member member = entityManager.find(Member.class, 1);
// 준영속 상태로 변경한다.
entityManager.detach(member);
member.setUserName("병합된 회원1");
// 다시 영속 상태로 변경해준다.
// 이때, 식별자를 기준으로 영속성 컨텍스트에서 조회한다.
// 식별자가 이미 존재한다면 UPDATE / 없다면 INSERT가 수행된다.
entityManager.merge(member);
삭제 (Removed)
Entity를 영속성 컨텍스트와 데이터베이스에서 삭제하는 경우입니다.
Member member = entityManager.find(Member.class, 1);
entityManager.remove(member);
'개발 > JPA' 카테고리의 다른 글
영속성 컨텍스트 (Persistence Context) (0) | 2024.02.10 |
---|
댓글