티스토리 뷰
entity manager : entity 관리
요청 하나당 entity를 만들어줌.
요청2개 -> entity 2개 만듦.
각각의 entity가 jdbc를 쓴다.
jpa의 구현체가 hibernate > hibernate는 sqlsession 사용 > sqlsession에서는 jdbc를 사용 !
open session은 쓰면 사용자가 선택한 메소드에 따라서 select ~ delete까지 메소드를 적절하게 써준다.
if) select 사용 시, jdbc를 통해서 preparestatement로 execute가 될 것임.
exectuequery, executeupdate : 알맞는 메소드 진행될 것임.
entity manager는 persistenceContext 영역을 사용함.
persistenceContext 영역: entity를 관리하는 영역, 영속 컨텍스트
application context 영역: 자바 빈 컨테이너를 관리함.
entity manager안에 persistenceContext가 있다.
entity manager가 메모리에 할당되면 자기가 가진 영역 중에서 persistenceContext영역을 할당함.
이 영역에 등록시키는 메소드가 persist()이다.
insert > persist("엔티티") > "엔티티"가 persistenceContext안에 들어가게 된다. > 영속 컨텍스트
@PersistenceContext //jpa가 관리함. 영속컨텍스트를 만들어라는 어노테이션.
entityManager.persist(); //영속 컨텍스트에 등록
영속성 컨텍스트에 등록하는 이유?
flush() : 안에 있는 것을 비워주면서 목적지까지 도달하는 것 > 영속성 컨텍스트에 있는 내용을 쿼리로 내보낸다는 느낌.
persist() : insert라기보다 영속성 컨텍스트에 등록만 해주는 느낌으로 봐야 함. flush가 되어야 insert가 됨.
@Transactional : begin, commit 해주는 애, 트랜잭션에 대한 환경을 구축해줌.
@Rollback(false) : 단위테스트에만 사용 가능, 자동롤백 방지
Optional.ofNullable() : 널인지 검사하는거
Assertions.assertThat : 알트+엔터 > add static import 엔터 > assertThat만 써도 됨.
persist() : 1차 캐시에 등록됨.
1차 캐시에 기억해놓고 엔티티를 관리함. 캐시 안에 있으면 select를 또 안함.(성능 최적화)
entityManager.flush(); //먼저 쿼리 내보내기//1차 캐시에 기억된 상태, 실무에서 사용할 수도 있음.
entityManager.clear(); //캐시 비우기//실무에서 거의 사용할 일 없음.
더티체킹
/*순서 메모*/ 꼼꼼히
엔티티2개 선언
1차 캐시 저장
INSERT
1ck(1차캐시삭제)
... 순서 메모하기...
영속상태:persistence영역에 있으면
비영속상태:persistence영역에 없으면, detach()
오류가 detach가 뜨면 비영속상태임을 알고 있자!
커밋 시 플러시가 자동 호출된다.
@PersistenceContext //주입하는게 아니라 주입받는 것!
Optional.ofNullable((null이 아닐 때 들어가는 것.).orElseGet())
orElse() : 내가 정해놓은 객체를 넣어주고, null일 때 여기에 있는 내용이 들어감.
orElseGet() : Supplier라서 람다식 사용 가능, 참조형으로 new를 쓸 수 있음.
!!NPE방어!!
'2022 > jpa' 카테고리의 다른 글
day03[JPA new project] (0) | 2022.11.30 |
---|---|
day03[벌크 연산, Repository, 쿼리메소드] (0) | 2022.11.30 |
day02[JPQL] (0) | 2022.11.15 |
day02[create table] (0) | 2022.11.15 |
day02[JPA new project] (0) | 2022.11.15 |