가자공부하러!

Hibernate(4) - 엔티티 매핑 본문

공부/Java

Hibernate(4) - 엔티티 매핑

오피스엑소더스 2019. 11. 20. 13:09

1. 엔티티 매핑 종류

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

  > 필드와 컬럼 매핑 : @Column

  > 기본 키 매핑 : @Id

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

 

2. 객체와 테이블 매핑

  > @Entity

    - NoArgs 생성자 필수

    - final 클래스, enum, interface, inner 클래스 불가

    - 필드에 final 불가

  > @Table(name = "DB테이블이름", catalog = "", schema = "", uniqueConstraints = "")

 

3. DB스키마 자동 생성

  > 애플리케이션 실행 시점에 테이블을 만들 수 있음

  > 데이터베이스 방언을 활용해서 데이터베이스에 맞는 적절한 DDL 생성

  > 방법 : persistence.xml에 설정값 입력 -> <property name="hibernate.hbm2ddl.auto" value="옵션"/>

  > 옵션 : create, create-drop, update, validate, none

    - update옵션에서 컬럼추가는 가능하지만 컬럼 삭제는 안된다.

  > 주의 

    - 운영장비에는 절대 create, create-drop, update를 사용하면 안된다.

    - 개발 초기 단계는 create또는 update, 테스트 서버는 update또는 validate, 스테이징과 운영 서버는 validate또는 none

create 설정에 따른 쿼리

> @Column(unique = true, length = 10, nullable = false)

    - DB에 제약조건을 설정해준다. JPA 실행 로직에는 영향을 주지 않는다.

 

4. 필드와 컬럼 매핑

  > @Column()이 가질 수 있는 속성

  > @Enumerated()가 가질 수 있는 속성

    - EnumType.ORDINAL을 사용하면 심각한 버그가 발생할 수 있기 때문에 사용하지 않는 것을 권장

  > @Lob

    - 매핑하는 필드 타입에 따라서 문자인 경우 CLOB, 나머지는 BLOB

  > @Transient

    - 필드 또는 메소드가 영속하지 않음을 표시

    - DB와 관련없이 동작할 필요가 있는 경우에 사용

    - 필드와 메소드는 매핑에서 제외되며, 주로 메모리상에서만 임시로 어떤 값을 보관하고 싶은 경우에 사용한다.

 

5. 기본 키 매핑

  > @Id : 직접할당

  > @GeneratedValue : 자동생성

    - (strategy = GenerationType.AUTO)

      - DB특성에 맞게 IDENTITY, SEQUENCE, TABLE 중 하나를 자동으로 선택해줌

    - (strategy = GenerationType.IDENTITY)

      - MySQL계열의 auto_increment에 대응

      - auto_increment는 DB에서 수행하기 때문에 객체가 영속성 컨텍스트로 insert될 때 1차 캐시에는 null로 저장되는 문제가 있다.

      - 문제를 방지하기 위해 예외적으로 insert가 즉시 실행되어 ID를 리턴하고 영속성 컨텍스트에 PK로 저장된다.

    - (strategy = GenerationType.SEQUENCE)

      - 시퀀스 오브젝트를 만들어줌

      - 직접 만든 시퀀스를 사용하고 싶다면 @SequenceGenerater를 사용하면 됨

      - allocationSize의 기본값이 50이므로 하나씩 증가하도록 1로 설정해주어야 함

        - 성능최적화를 위해 nextVal()할 때 미리 50개를 가져온다. 이 때, DB에는 50이 한번에 증가되고 메모리에서는 1씩 사용하는 방법.

  

    - (strategy = GenerationType.TABLE)

      - 시퀀스와 유사하게 사용

      - 성능이 떨어질 가능성이 있음

 

Comments