1. 영속성 컨텍스트
1-1. 엔티티 등록 - 트랜잭션을 지원하는 쓰기 지연

Entitymanager em = emf.createEntityManager();
EntityTransaction transaction = em.getTransaction();
ts.begin();
em.persist(memberA);
em.persist(memberB);
ts.commit();
1-2. 엔티티 수정 - 변경감지(Dirty Checking)

Entitymanager em = emf.createEntityManager();
EntityTransaction transaction = em.getTransaction();
ts.begin();
Member memberA = em.find(Member.class, "memberA");
memberA.setUsername("admin");
memberA.setAge(20);
ts.commit();
-> flush()가 호출되는 시점에 Entity와 스냅샷을 전부 비교 후 (최적화된 알고리즘으로 진행)
변경이 된 것을 감시(Dirty Checking)하고 update 쿼리를 작성한다. 그 후에 update 쿼리를 날린다.
1-3. 엔티티 삭제
Member memberA = em.find(Member.class, "memberA");
em.remove(memberA);
2. 플러시(flush)
2-1. 플러시 발생
- 영속성 컨텍스트의 변경 내용을 데이터베이스에 반영
- 변경 감지
- 수정된 엔티티 쓰기 지연 SQL 저장소에 등록
- 쓰기 지연 SQL 저장소의 쿼리를 데이터베이스에 전송(등록, 수정, 삭제 쿼리)
2-2. 영속성 컨텍스트를 플러시하는 방법
- 트랜잭션 커밋 했을 때 - 플러시 자동 호출
- em.flush(); - 직접 호출하는 방법
- jpql 쿼리 실행 - 플러시 자동 호출
2-3. 플러시 주요사항
- 영속성 컨텍스트를 비우지 않음.
- 영속성 컨텍스트의 변경 내용을 데이터베이스에 동기화
- 트랜잭션이라는 작업 단위가 중요 -> 커밋 직전에만 동기화하면 됨.
- JPA는 동시성, 데이터를 맞추거나 등을 모두 트랜잭션에 위임한다.
2-4. 준영속 상태
- 영속 상태에서 준영속 상태로 빠져나온 상태
- 준영속 : 영속 상태의 엔티티가 영속성 컨텍스트에서 분리(detached)
- 영속성 컨텍스트가 제공하는 기능을 사용 못하는 상태다.
2-5. 준영속 상태로 만드는 방법(알아만 둘 것)
- em.detach(entity);
: 특정 엔티티만 준영속 상태로 전환
- em.clear();
: 영속성 컨텍스트를 완전히 초기화
- em.close();
: 영속성 컨텍스트를 종료
3. 엔티티 매핑 소개
- 객체와 테이블 매핑 : @Entity, @Table
- 필드와 컬럼 매핑 : @Column
- 기본 키 매핑 : @Id
- 연관관계 매핑 : @ManyToOne, @JoinColumn
3-1. 객체와 테이블 매핑 - @Entity
- @Entity가 붙은 클래스는 JPA가 관리하는 엔티티라고 한다.
- JPA를 사용해서 테이블과 매핑할 클래스는 @Entity가 필수
- 주의사항
-> 기본 생성자 필수(파라미터가 없는 public 또는 protected 생성자가 존재해야한다.)
-> final 클래스, enum, interface, inner 클래스 사용 불가
-> 저장할 필드에 final 사용 불가
3-2. @Entity 속성 정리
- name 속성
-> JPA에서 사용할 엔티티 이름을 지정
-> 기본값 : 클래스 이름을 그대로 사용한다.
-> 같은 클래스 이름이 없으면 가급적 기본값을 사용한다.
-> 기본값을 쓸 것.
3-3. @Table
- 해당 엔티티와 매핑할 테이블을 지정
- name : 매핑할 테이블의 이름(굳이 언급하지 않으면 엔티티 이름을 사용한다.)
- catalog : 데이터베이스 catalog 매핑
- schema : 데이터베이스 schema 매핑
- uniqueConstraints : DDL 생성시에 유니크 제약 조건 생성
4. 데이터베이스 스키마 자동 생성
-
hibernate.hbm2ddl.auto
-
create : 기존 테이블 삭제 후 다시 생성(Drop + Create)
-
create-drop : create와 같으나 종료 시점에 drop
-
update : 변경문만 반영(운영DB에는 사용하면 안됨)
-
validate : 엔티티와 테이블이 정상 매핑 되었는지만 확인
-
none : 사용하지 않음
=> 데이터베이스 방언 별로 달라진다.
-
운영장비에는 절대 create, create-drop, update 사용하면 안됨.
-
개발 초기 단계는 create 또는 update 사용
-
테스트 서버는 update 또는 validate 사용
-
스테이징과 운영 서버는 validate 또는 none 사용
5. DDL 생성 기능
-
제약조건 추가 : 회원이름은 필수, 10자 초과하지 않게
-> @Column(nullable=false, length=10)
-
유니크 제약조건 추가
-> @Table(uniqueConstraints={
@UniqueConstraint(name="NAME_AGE_UNIQUE")
name=""NAME_AGE_UNIQUE",
columnNames={"NAME", "AGE"}
)
})
=> DDL 생성 기능은 DDL을 자동 생성할 때만 사용되고 JPA의 실행 로직에는 영향을 주지 않는다.
6. 필드와 컬럼 매핑
- @Column : 컬럼 매핑
- @Temporal : 날짜 타입 매핑
- @Enumerated : enum 타입 매핑
- @Lob : BLOB, CLOB매핑(대용량처리)
- @Transient : 특정 필드를 컬럼에 매핑하지 않음(매핑 무시)
7. @Column
- name : 필드와 매핑할 테이블의 컬럼 이름
- nullable : null 값의 허용 여부를 설정한다. false로 설정하면 DDL 생성 시에 not null 제약조건이 붙는다.
- unique : @Table uniqueConstraints와 같지만 한 컬럼에 간단히 유니크 제약 조건을 걸 때 사용한다.
- length : 문자 길이 제약조건, String 타입에만 사용
8. 기본키 매핑 방법
-
직접 할당 : @Id만 사용
-
자동 생성 : @GeneratedValue -> 전략 4가지
-> IDENTITY
: 데이터베이스에 위임, MySQL 사용
: MySQL, SQL Server, DB2
-> SEQUENCE
: 데이터베이스 시퀀스 오브젝트 사용, Oracle에서 사용.
: ORACLE, PostgreSQL, DB2, H2
@SequenceGenerator 필요
-> TABLE
: 키 생성용 테이블 사용, 모든 DB에서 사용
@TableGenerator 필요
-> AUTO
: 방언에 따라 자동 지정, 기본값.
=> AUTO는 DB방언에 맞춰서 IDENTITY, SEQUENCE, TABLE 3개의 방식 중 하나가 선택 된다.
9. @SequenceGenerator
- name : 식별자 생성기 이름
- sequenceName : 데이터베이스에 등록되어 있는 시퀀스 이름
- initialValue : DDL 생성 시에만 사용됨, 시퀀스 DDL을 생성할 때 처음 시작하는 수를 지정한다.(기본값 : 1)
- allocationSize: 시퀀스 한 번 호출에 증가하는 수
(데이터베이스 시퀀스 값이 하나씩 증가하도록 설정되어 있으면 이 값을 반드시 1로 설정해야한다. 기본값 : 50)
- catalog schema: 데이터베이스 catalog, schema
10. TABLE 전략
- 잘 쓰진 않는다.
- 키 생성 전용 테이블을 하나 만들어서 데이터베이스 시퀀스를 흉내내는 전략
- 장점 : 모든 데이터베이스에 적용가능
- 단점 : 성능(느림)
11. 연관관계 매핑 기초
- 객체와 테이블 연관관계의 차이를 이해
- 객체의 참조와 테이블의 외래키를 매핑
- 용어이해
-> 방향(Direction) : 단방향, 양방향
-> 다중성(Mulriplicity) : 다대일(N:1), 일대다(1:N),
일대일(1:1), 다대다(N:N)
-> 연관관계 주인(Owner) : 객체 양방향 연관관계는 관리하는 주인이 필요
12. 단방향 연관관계

- consol
