JPA공부함에 있어서 내용은 인프런 김영한님 강의와 책을 참고하여 정리한 것입니다 (필기 및 공부정리용)
https://www.inflearn.com/course/ORM-JPA-Basic#
[자바 ORM 표준 JPA 프로그래밍 - 기본편 - 인프런 | 강의
JPA를 처음 접하거나, 실무에서 JPA를 사용하지만 기본 이론이 부족하신 분들이 JPA의 기본 이론을 탄탄하게 학습해서 초보자도 실무에서 자신있게 JPA를 사용할 수 있습니다., 본 강의는 자바 백엔
www.inflearn.com](https://www.inflearn.com/course/ORM-JPA-Basic#)
엔티티 매니저 팩토리, 엔티티 매니저
Entity ManagerFactory
애플리케이션 전체에서 하나만 공유해서 사용
Entity Manager
- 스레드간 공유 절대 하면 안된다
- 꼭 사용 후 반납
- 트랜잭션이 시작할 때 connection객체를 획득하여 사용
영속성 컨텍스트
JPA는 데이터를 바로 DB로 저장을 하는 것이 아니라 영속성 컨텍스트라는 곳에 임시 저장을 해둔다
저장 뿐만 아니라 DB로부터 값을 조회해 와도 영속성 컨텍스트에 저장을 해둔다
생명주기
비영속 -> 영속 -> 준영속 -> 삭제
영속성 컨텍스트에 저장이 되어있지 않은 순수 자바 객체 형태로 있는 상태: 비영속상태
영속성 컨텍스트에 저장되어 있는 상태: 영속상태
영속상태에서 다시 비영속이 된 경우: 준영속상태
영속성 컨텍스트와 DB에서 삭제가 된 경우: 삭제상태
특징
1차캐시, 동일성 보장1차캐시는 @Id의 값과 객체를 key-value형태로 가지고 있다만일 1차 캐시에 없으면 DB로 부터 조회를 해온 후 엔티티를 생성및 1차캐시에 저장을 한 후 저장 된 영속상태의 엔티티를 반환해준다
조회를 하게 되면 key의 값을 가지고 1차 캐시에서 우선적으로 찾기 때문에 동일성을 보장해준다
엔티티를 저장을 하거나 DB로부터 조회를 하면 영속성 컨텍스트 내부 1차캐시에 저장이 된다
쓰기 지연
{ tx.begin(); Member member = new Member(); member.setId(1L); member.setName("MemberA"); em.persist(member); //이때 insert쿼리문이 실행이 되지 않고 print문 출력 후 tx.commit()이 호출 된후 쿼리문이 실행 Member findMember1 = em.find(Member.class, 1L); Member findMember2 = em.find(Member.class, 1L); System.out.println(findMember1 == findMember2); //true출력 동일성 보장 tx.commit(); }
- 트랜잭션이 커밋을 하기 전까지 DB에 엔티티를 저장하는 insert쿼리를 내보내지 않고 sql 저장소에 쿼리를 모와두고 커밋 후에 DB에 저장을 한다
- 변경감지엔티티 수정시 발생된다 앞서 1차캐시는 @Id의 값과 객체를 key-value형태로 가진다 했는데 추가로 최초상태를 복사해서 저장을 해둔 스냅샷을 가지고 있다기본적으로 update쿼리를 전체 칼럼에 대해서 실행을 하지만
@org.hibernate.annotations.DynamicUpdate
를 사용하면 변경 칼럼에 대해서만 실행된다 - 해당 스냅샷과 commit()직전 flush()가 호출이 되는데 flush()시점에 엔티티와 스냅샷을 비교해서 변경된 엔티티에 대한 쿼리문을 sql저장소에 모와둔다
- 영속상태의 엔티티에 대해서만 적용된다
- 지연 로딩
CRUD
- Entity 저장 :
em.persist(Entity)
- Entity 조회 :
em.find(Entity.class, "ID")
- Entity 수정 :
entity.set~~()
--> collection수정하듯이 하면 된다 - Entity 삭제 :
em.remove(Entity)
엔티티 매핑
@Entity
JPA가 관리하는 객체라고 알려준다
주의사항
- 기본 생성자는 필수
- final클래스, enum, interface, inner클래스에는 사용불가
- 저장하고자 하는 변수에 final불가
@Table
매핑하고자 하는 DB 테이블을 지정 (name = ~~)
@Id
primary key에 해당하는 변수에 지정
꼭 할당을 해주어야 한다 --> 1차캐시에서 key값으로 사용
없으면 예외 발생
직접할당
사용자가 할당을 해주면 된다
자동할당: DB에서 생성된 값 할당
Identity전략: Mysql, SQL server, H2사용
@GenerateValue(strategy=GenerateType.IDENTITY)
사용Sequence전략: Oracle, H2사용
@SequenceGenerator
,@TableGenerator
을 통해서 sequence생성, generator에 지정--> oracle을 사용을 안해봐서 잘 어떻게 동작하는지 추후 공부
@GenerateValue(strategy=GenerateType.SEQUENCE, generator="~~")
사용Auto전략자동으로 JPA가 설정을 해준다
Default값으로 설정
@Column
- name: 칼럼 명
- length: 문자길이
- nullable: null값 허용, default값 true
@Enumerated
enum타입 매핑시 사용
- value:EnumType.STRING --> enum 이름을 저장
- EnumType.ORDINAL(default값) --> 순서값으로 저장
@Temporal
시간 날짜 정보 매핑
TemporalType.DATE, DATETIME(Mysql사용), TIME, TIMESTAMP(ORACLE에서 사용)
@Trasient
매핑을 원치 않는 변수에 사용
단순 계산 정보를 입력을 하거나 할때 사용한다
JPA공부함에 있어서 내용은 인프런 김영한님 강의와 책을 참고하여 정리한 것입니다 (필기 및 공부정리용)
'공부기록 > JPA' 카테고리의 다른 글
JPA-프록시 (0) | 2022.01.26 |
---|---|
JPA-고급매핑2 (0) | 2022.01.20 |
JPA 고급매핑1 (0) | 2022.01.20 |
JPA 연관관계 매핑 (0) | 2021.12.29 |
JPA시작 (0) | 2021.12.24 |