JPA2

김영환·2023년 10월 10일
0

JPA

목록 보기
3/4

flush

1. 플러시 발생

  • 영속성 컨텍스트의 변경 내용을 데이터베이스에 반영

  • 변경 감지

  • 수정된 엔티티 쓰기 지연 SQL 저장소에 등록

  • 쓰기 지연 SQL 저장소의 쿼리를 데이터베이스에 전송(등록, 수정, 삭제 쿼리)

    2. 영속성컨텍스트를 플러시하는 방법

  • 트랜잭션 커밋 - 플러시 자동 호출

  • em.flush() - 직접 호출

  • jpql 쿼리 시행 - 플러시 자동 호출

    3. 플러시 주요사항

  • 영속성 컨텍스트를 비우지 않음

  • 영속성 컨텍스트의 변경 내용을 데이터베이스에 동기화

  • 트랜잭션이라는 작업 단위가 중요 -> 커밋 직전에만 동기화 하면 됨

  • JPA는 동시성, 데이터를 맞추거나 등을 모두 트랜잭션에 위임한다.

엔티티 매핑

  • 객체와 테이블 매핑 : @Entity, @Table

  • 필드와 컬럼 매핑 : @Column

  • 기본 키 매핑 : @Id

  • 연관관계 매핑 : @ManyToOne, @JoinColumn

    1. 객체와 테이블 매핑 - @Entity

    • @Entity가 붙은 클래스는 JPA가 관리하는 엔티티라 한다.
  • JPA를 사용해서 테이블과 매핑할 클래스는 @Entity필수

  • 주의사항

    -> 기본 생성자 필수(파라미터가 없는 public 또는 protective 생성자)
    -> final 클래스, enum, interface, inner 클래스 사용x
    -> 저장할 필드 final 사용x

2. @Entity name속성

  • JPA에서 사용할 엔티티 이름을 지정
  • 기본값 : 클래스 이름을 그대로 사용한다.
  • 같은 클래스 이름 없으면 가급적 기본값을 사용한다.
  • 그냥 기본값을 쓴다 라고 생각하면 됨

3. @Table

  • 엔티티와 매핑할 테이블 지정
  • name : 매핑할 테이블 이름(엔티티 이름 사용)
  • catalog : 데이터베이스 catalog매핑
  • schema : 데이터베이스 schema매핑
  • unuqueConstraints : DDL 생성 시에 유니크 제약 조건 생성

4. 데이터베이스 스키마 자동생성

  • hibernate.hbm2ddl.auto
  • create : 기존테이블 삭제 후 다시 생성(Drop + Create)
  • create-drop : create와 같으나 종료시점에 drop
  • update : 변경문만 반영(운영DB에는 사용하면 절대 안됨)
  • validate : 앤티티와 테이블이 정상 매핑되었는지만 확인
  • none : 사용하지 않음
    => 데이터베이스 방언 별로 달라진다
  • 운영장비에는 절대 create, dreate-drop, update 사용하면 안됨
  • 개발초기 단계는 create 또는 update
  • 테스트 서버는 update 또는 validate
  • 스테이징과 운영 서버는 validate 또는 none

5. DDL 생성 기능

만약 회원이름을 필수, 10자 초과 제약 조건을 추가한다면

 @Column(nullable=false, leength=10)

유니크 제약조건을 추가한다면

@Table(uniqueConstraints={
	@UniqueConstraints(name="NAME_AGE_UNIQUE", columnNames={"NAME", "AGE"})	
})

=> DDL 생성 기능은 DDL을 자동 생성할 때만 사용되고 JPA의 실행 로직에는 영향을 주지 않는다.

6. 필드와 컬럼 매핑

  • @Column : 컬럼 매핑

@Column

  • name : 필드와 매핑할 테이블의 컬럼 이름
  • nullale : null 값의 허용 여부를 설정한다. false로 설정하면 DDL 생성시에 non null 제약조건이 붙는다.
  • unique : @Table uniqueConstraints와 같지만 한 컬럼에 간단히 유니크 제약 조건을 걸 떄 사용한다.
  • length : 문자 길이 제약조건, String 타입에만 사용
  • @Temporal : 날짜 타입 매핑
  • @Enumerated : enum 타입 매핑
  • @Lob : BLOB, CLOB 매핑
  • @Transient : 특정 필드를 컬럼에 매핑하지 않음(매핑 무시)

8. 기본키 매핑 방법

  • 직접 할당 : @Id만 사용
  • 자동 생성 : @GeneratedValue -> 4가지 전략이 있음

-> IDENTITY : 데이터베이스에 위임, MYSQL, SQL Server, DB2 이러한 개념이 들어있어야 사용
-> SEQUENCE : 데이터베이스 시퀀스 오브젝트 사용 , ORACLE, PostgreSQL, DB2, H2에서 사용(@SequnceGenerator 필요)
-> TABLE : 키 생성용 테이블 사용, 모든 DB에서 사용(@TableGenerator필요)
-> AUTO : 방언에 따라 자동 지정, 기본값
-> AUTO는 DB방언에 맞춰서 IDENTITY, SEQUENCE, TABLE 3개의 방식 중 하나가 선택이 된다.

9. @SequenceGenerator

  • name : 식별자 생성기 이름
  • sequenceName : 데이터베이스에 등록되어 있는 시퀀스 이름
  • initialValue : DDL 생성 시에만 사용됨, 시퀀스 DDL을 생성할 때 처음 시작하는 수를 지정한다(기본값 1)
  • allocationSize : 시퀀스 한 번 호출에 증가하는 수(데이터베이스 시퀀스 값이 하나씩 증가하도록 설정되어 있으면 이 값을 반드시 로 설정해야 한다.)(기본값 50)
  • catalog, schema : 데이터베이스 catalog, schema

10. @TABLE 전략 -> 잘 쓰진 않는다

  • 키 생성 전용 테이블을 하나 만드어서 데이터베이스 시퀀스를 흉내내는 전략
  • 장점 : 모든 데이터베이스에 적용가능
  • 단점 : 성능이 떨어짐
profile
개발

0개의 댓글