객체와 관계형 데이터베이스의 차이
- 상속
- 연관관계
- 데이터 타입
- 데이터 식별 방법
주의사항
- EntityManagerFactory는 하나만 생성해서 애플리케이션 전체에서 공유
- EntityManager는 스레드 간에 공유하면 안 된다(사용하고 버려야 함)
- JPA의 모든 데이터 변경은 트랜잭션 안에서 실행
영속성 컨텍스트
- 영속성 컨텍스트는 논리적인 개념
- EntityManager를 통해서 영속성 컨텍스트에 접근한다
[영속성 컨텍스트의 이점]
- 1차 캐시 : 반복 가능한 읽기(repeatable read) 등급의 트랜잭션 격리 수준을 DB가 아닌 애플리케이션에서 제공
- 동일성(identity) 보장
- 트랜잭션을 지원하는 쓰기 지연 (transactional write-behind) : 트랜잭션 커밋 순간 DB에 SQL을 보낸다
- 변경 감지 (Dirty Checking)
- 지연 로딩 (Lazy Loading)
[플러시(flush)]
- 영속성 컨텍스트의 변경 내용을 데이터베이스에 반영
- 영속성 컨텍스트를 비우지는 않음
- 트랜잭션이라는 작업 단위가 중요. 커밋 직전에만 동기화하면 됨
[플러시가 발생하는 경우]
- 변경 감지
- 수정된 엔티티 쓰기 지연 SQL 저장소에 등록
- 쓰기 지연 SQL 저장소의 쿼리를 데이터베이스에 전송 (등록, 수정, 삭제 쿼리)
[플러시 하는 방법]
- em.flush() : 직접 호출
- 트랜잭션 커밋 : 플러시 자동 호출
- JPQL 쿼리 실행 : 플러시 자동 호출
[플러시 모드 옵션]
- FlushModeType.AUTO : 커밋이나 쿼리를 실행할 때 플러시 (기본값)
- FlushModeType.COMMIT : 커밋할 때만 플러시
[준영속 상태]
- 영속 상태의 엔티티가 영속성 컨텍스트에서 분리(detached)
- 영속성 컨텍스트가 제공하는 기능을 사용 못함
[준영속 상태로 만드는 방법]
- em.detach(entity) : 특정 엔티티만 준영속 상태로 전환
- em.clear() : 영속성 컨텍스트를 완전히 초기화
- em.close() : 영속성 컨텍스트를 종료
Entity의 생명주기
- 비영속 (new/transient) : 영속성 컨텍스트와 전혀 관계가 없는 새로운 상태
- 영속 (managed) : 영속성 컨텍스트에 관리되는 상태
- 준영속 (detached) : 영속성 컨텍스트에 저장되었다가 분리된 상태
- 삭제 (removed) : 삭제된 상태
JPQL
- JPQL은 엔티티 객체를 대상으로 쿼리
- SQL은 데이터베이스 테이블을 대상으로 쿼리
- 테이블이 아닌 객체를 대상으로 검색하는 객체 지향 쿼리
- SQL을 추상화했기 때문에 특정 데이터베이스 SQL에 의존하지 않음
'JPA' 카테고리의 다른 글
자바 ORM 표준 JPA 프로그래밍 - 기본(김영한) _ 값 타입 (0) | 2021.07.31 |
---|---|
자바 ORM 표준 JPA 프로그래밍 - 기본(김영한) _ 프록시와 연관관계 관리 (0) | 2021.07.30 |
자바 ORM 표준 JPA 프로그래밍 - 기본(김영한) _ 고급 매핑 (0) | 2021.07.30 |
자바 ORM 표준 JPA 프로그래밍 - 기본(김영한) _ 연관관계 매핑 (0) | 2021.07.30 |
자바 ORM 표준 JPA 프로그래밍 - 기본(김영한) _ 엔티티 매핑 (0) | 2021.07.29 |