영속성 컨텍스트 (persistence context)
- 엔티티를 영구 저장하는 환경
1. 엔티티 생명 주기
- 비영속(new/transient)
객체를 생성만 할뿐 저장하지 않은 상태
Member member = new Member(); member.setId(id); member.setUserName("test");
- 영속 (managed)
엔티티 메니저를 통해 영속성 컨텍스트에 저장한 상태 (영속성 컨텍스트에의해 관리되는 상태)
조회된 엔티티도 영속 상태
// 영속성 컨텍스트에 저장 entityManager.persist(member); // 조회 // 영속성 컨텍스트에서 조회는 기본키를 통해서 조회 entityManager.find(Member.class, id); // 조회 - 여려개를 조회 할때는 jpql을 사용 List<Member> members = entityManager.createQuery("select m from Member m", Member.class).getResultList(); // merge()사용하여 영속상태로 변경 Member member = new Member(); member.setId(id); // 영속상태로 변경 후 삭제 Member tMember = entityManager.merge(member); entityManager.remove(tMember);
- 준영속 (Detached)
영속성 컨텍스트에 의해 더 이상 관리되지 않는 상태
// 저장 entityManager.persist(member); // 준영속 상태로 변경 -> 1차캐시 및 지연sql저장소에서 삭제 entityManager.detach(member); // 준영속 상태는 변경 감지를 할수 없음/db 반영 안됨 member.setUserName("test"); // member에 대한 inster sql은 db에 반영되지 않음 entityTransaction.commit(); // entityManager가 관리하던 모든 entity // 영속성 컨텍스트 모든 엔티티를 준영속상태로 변경 entityManager.clear(); entityManager.close();
- 삭제
엔티티를 영속성 컨텍스트 및 db 에서 삭제
삭제 대상 엔티티를 먼저 검색 후 삭제해야함
Member member = entityManager.find(Member.class, id); entityManager.remove(member);
5 entity 추가/수정/삭제/조회
2. 특징
영속상태는 반드시 식별자가 필요 (@Id)
트랜젝션을 커밋할때 영속성 컨텍스트에 저장된 엔티티가 db에 저장됨
1차 캐시
// 1차 캐시에 저장을 하며 DB에는 저장하지 않는다. entityManager.persist(member); // 1차 캐시에서 우선적으로 검색 실행하며 없을 경우 db에서 조회 // 1차 캐시에 저장 후 영속 상태의 엔티티 반환 Member member1 = entityManager.find(Member.class, id);
동일성 보장
// 1차 캐시에 있는 동일한 엔티티를 반환하므로 동일성을 보장 // member1 == member2 / true Member member1 = entityManager.find(Member.class, id); Member member2 = entityManager.find(Member.class, id);
트랜잭션을 통한 쓰기 지연
- 트랜잭션을 커밋하기 전까지 등록/수정/삭제 sql을 보관후 커밋 실행시 db에 전달하여 sql을 실행하여 db에 반영
'java' 카테고리의 다른 글
[Mockito] doReturn / thenReturn (0) | 2021.08.04 |
---|---|
[Java] Jackson - JSON 파일 읽기 - 저장 (0) | 2021.04.15 |
[Lombok] @Builder (0) | 2020.10.15 |
[JPA] EntityManagerFactory/EntityManager (0) | 2020.08.30 |
[JPA] jpa 설정 - persistence.xml (0) | 2020.08.29 |