728x90
영속 단위 기준으로 초기화
EntitiyManagerFactory emf = Persistence.createEntityManagerFactory("jpabegin");
persistence.xml 파일에 정의한 영속 단위 기준으로 초기화
필요한 자원 생성
emf.close();
팩토리 닫음
사용한 자원 반환
EntityManager로 DB 연동
EntityManager entityManager = emf.createEntityManager(); //EntityManager 생성
EntityTransaction transaction = entityManager.getTransaction(); //EntityTransaction 구함
try {
transaction.begin(); // 트렌젝션 시작
...entityManager로 DB 작업
transaction.commit(); // 트렌젝션 커밋
} catch (Exception ex) {
transaction.rollback(); // 트렌젝션 롤백
} finally {
entityManager.close(); // 엔티티매니저 닫음
}
저장과 쿼리 실행 시점
transaction.begin();
User user = new User("user@user.com", "user", LocalDateTime.now());
entityManager.persist(user);
log.info("EntityManager.persist 호출함");
transaction.commit();
log.info("EntityTransaction.commit 호출함");
persist때 insert쿼리문이 실행되지 않고 commit 시점에 insert 쿼리가 실행된다.
수정도 commit 시점에 알맞게 실행된다.
영속 컨텍스트
EntityManager 단위로 영속 컨텍스트 관리
커밋 시점에 영속 컨텍스트의 변경 내역을 DB에 반영(변경 쿼리 실행)
정리
기본구조
- EntityManagerFactory 초기화
- DB 작업이 필요할 때마다
- EntityManager 생성
- EntityManager로 DB 조작
- EntityTransactio으로 트렌젝션 관리
- 하지만 스프링과 연동할 때는
- 대부분 스프링이 대신 처리하므로 매핑 설정 중심으로 작업
영속성 컨텍스트
- 엔티티를 메모리에 보관
- 변경을 추적해서 트렌젝션 커밋 시점에 DB에 반영
https://www.youtube.com/watch?v=7ljqL8ThUts&list=PLwouWTPuIjUi9Sih9mEci4Rqhz1VqiQXX&index=2
엔티티 CRUD 처리
영속 컨텍스트는 트렌젝션 범위 안에서 유지가 된다.
EntityManager가 제공하는 메서드 이용
- persist() : 저장
- find(클래스, 식별자) : 조회
- 엔티티 타입, ID 타입이 맞아야 함
- 일치하지 않으면 익셉션
- 수정 : 트렌젝션 범위 내에서 변경된 값을 자동 반영
- remove() : 삭제, find메서드로 읽어온 객체를 전달해야 된다.
- merge()
https://www.youtube.com/watch?v=kmCKAwOie_I&list=PLwouWTPuIjUi9Sih9mEci4Rqhz1VqiQXX&index=3
엔티티 매핑
- 기본 어노테이션
- @Entity : 엔티티 클래스에 설정, 필수
- @Table : 매핑할 테이블 지정
- 애노테이션을 생략하면 클래스 이름과 동일한 이름에 매핑
- 속성
- name : 테이블 이름(생략 하면 클래스 이름과 동일한 이름)
- catalog : 카탈로그 이름 (예, MySQL DB 이름)
- schema : 스키마 이름 (예, 오라클 스키마 이름)
- @Id : 식별자 속성에 설정, 필수
- @Column : 매핑할 칼럼명 지정
- 지정하지 않으면 필드명/프로퍼티명 사용
- @Enumerated : enum 타입 매핑할 때 설정
- 설정 값
- EnumType.ORDINAL(기본값) : enum타입의 값의 순서를 저장
- 문자열 타입 칼럼에 매핑
- EnumType.STRING : enum 타입 값 이름을 저장
- 숫자 타입 칼럼에 매핑
- EnumType.ORDINAL(기본값) : enum타입의 값의 순서를 저장
- 설정 값
- @Temporal : java.util.Date, java.util.Calender 매핑
- 자바 8 시간/날짜 타입 등장 이후로 거의 안 씀
- @Basic : 기본 지원 타입 매핑(거의 안 씀)
엔티티 클래스 제약 조건(스펙 기준)
- @Entity 적용해야 함
- @Id 적용해야 함
- 인자 없는 기본 생성자 필요
- 기본 생성자는 public이나 protected여야 함
- 최상의 클래스여야 함
- final이면 안됨
접근 타입
- 두 개의 접근 타입
- 필드 접근 : 필드 값을 사용해서 매핑
- 프로퍼티 접근 : getter/setter 메서드를 사용해서 매핑
- 설정 방법
- @Id 애노테이션을 필드에 붙이면 필드 접근
- @Id 애노테이션을 getter 메서드에 붙이면 프로퍼티 접근
- @Access 애노테이션을 사용해서 명시적으로 지정
- 클래스 / 개별 필드에 적용 가능
- @Access(AccessType.PROPERTY) / @Access(AccessType.FIELD)
- 개인적으로 필드 접근 선호
- 불필요한 setter 메서드를 만들 필요 없음
https://www.youtube.com/watch?v=SbMJVuv8Iyo&list=PLwouWTPuIjUi9Sih9mEci4Rqhz1VqiQXX&index=4
728x90
'개발 > JPA' 카테고리의 다른 글
JPA 기초) 3. 엔티티 식별자 생성 방식, @Embeddable, @Embeddable 다른 테이블에 매핑하기, 컬렉션 매핑 (0) | 2022.08.23 |
---|---|
JPA 기초) 1.일단 해보기 (0) | 2022.08.23 |