EntityManager.persist(entity);
"entity"
에 들어가는 객체(Member, Team, .. 등)를 DB에 저장하는 구나!JPA에 관계없이 그냥 객체 생성만 된 상태
Member member = new Member();
member.setId("userA");
member.setUsername("회원1"0);
em.persist(member);
영속 비영속 상태 코드
// 비영속 상태
Member member = new Member();
member.setId(100L);
member.setName("Hello");
// 영속 상태
// EntityManager 안에있는 영속 컨텍스트에 관리가 된다는 뜻
// DB 쿼리가 실행되는지 확인
System.out.println("===== before =====");
em.persist(member);
System.out.println("===== after =====");
// 쿼리는 이 시점에 전송된다.
tx.commit();
tx.commit();
에서 전송된다.em.detach(member);
em.remove(member);
조회 시 영속 컨텍스트안에서 1차 캐시를 조회 후 해당 엔티티가 있을 경우 캐시를 조회 해 온다.
조회 시 영속 컨텍스트 안에서 1차 캐시를 조회 후 해당 엔티티가 없을 경우 데이터베이스에서 조회 해 온다.
데이터베이스 트랜잭션 내부에서 만들고 종료되기 때문에 하나의 비즈니스 로직이 종료될 경우 1차캐시는 다 사라지기 때문에 큰 도움이 되지는 않는다.
(비즈니스 로직이 복잡해 질 수록 효과는 커진다.)
// 비영속 상태의 값
Member member = new Member();
member.setId("member1");
member.setUsername("회원1");
// 영속
// 1차 캐시에 저장됨
em.persist(member);
// 조회
Member findMember = em.find(Member.class, "member1");
Member findMember2 = em.find(Member.class, "member2");
member1이라는 key값에 member객체 전체가 담겨있다.
Member findMember = em.find(Member.class, "member1");
Member findMember2 = em.find(Member.class, "member2");
1차 캐시로 반복 가능한 읽기 등급의 트랜잭션 격리 수준을 데이터베이스가 아닌 애플리케이션 차원에서 제공 하기 때문에 1차 캐시와 동일한 내용을 가지고온다.
Member a = em.find(Member.class, "member1");
Member b = em.find(Member.class, "member2");
결국 a, b라는 각가 다른객체에 할당하지만 같은 entity
를 가진다.
tx.begin(); // 트랜잭션 시작
em.persist(memberA);
em.persist(memberB);
// 여기까지는 insert sql을 데이터베이스에 보내지 않는다.
// 커밋하는 순간 데이터베이스에 insert sql을 보낸다.
tx.commit(); // 트랜잭션 커밋완료
- memberA와 memberrB는 둘 다 쓰기지연 SQL저장소에 저장되어있고 실제 DB에 적용은 안된 상태
- commit() 시점에 쓰기지연 SQL에 저장된 쿼리들을 다 실행시켜서 DB에 적용한다.
flush()
가 호출되는 시점에 Entity와 스냅샷
을 전부 비교후감지(Dirty Checking)
한 후에update
쿼리를 작성 후,update
쿼리를 전송한다. tx.begin(); // 트랜잭션 시작
// 영속 엔티티 조회
Member memberA = em.find(Member.class, "memberA");
memberA.setUsername("hello");
memberA.setAge(10);
//em.update(member);
tx.,commit(); // 커밋
// 삭제 대상 엔티티 조회
Member memberA = em.find(Member.class, "memberA");
em.remove(memberA); // 엔티티 삭제
영속 -> 준영속
준영속 : 영속 상태의 엔티티가 영속성 컨텍스트에서 분리(detached)
영속성 컨텍스트가 제공하는 기능을 사용하지 못함
em.detach(entity) : 특정 엔티티만 준영속 상태로 전환
em.clear() : 영속성 컨텍스트를 완전히 초기화
em.close() : 영속성 컨텍스트를 종료