[JPA] 4. JPA Mapping

garam0410·2022년 1월 11일
0

JPA

목록 보기
4/5

4. JPA Mapping


  • JPA를 사용하면서 Entity와 Table 매핑은 가장 중요함

  • Mapping Annotation을 지원하는데, 크게 4가지로 나뉨

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

    2. 기본키 매핑 : @Id

    3. 필드와 컬럼 매핑 : @Column

    4. 연관관계 매핑 : @ManyToOne, @JoinColumn


@Entity


  • @Entity를 사용해서 매핑할 클래스를 지정

  • JPA가 관리

  • 기본 생성자 필수

  • final 클래스, enum, interface, inner 클래스 사용 X


속성

  • name : JPA에서 사용할 Entity 이름 지정, 기본값은 해당 클래스명

@Table


  • Entity와 매핑할 Table 지정

  • 생략하면 매핑한 Entity 이름을 Table 명으로 사용


속성

  • name : 매핑할 Table 이름 (기본값은 Entity 명)

  • catalog : catalog 기능이 있는 데이터베이스에서 catalog 매핑

  • schema : schema 기능이 잇는 데이터베이스에서 schema를 매핑


@Id


  • 기본적으로 @Id 어노테이션만 사용하면, 기본키를 어플리케이션에서 직접 할당

  • @GeneratedValue(strategy = GenerationType.타입) 을 통해서 기본키 생성 전략 변경 가능하며, 기본값은 데이터베이스마다 자동으로 선택되는 AUTO

  • 키 생성 전략이 다양한 이유는 데이터베이스 벤더마다 지원하는 방식이 다르기 때문


@GeneratedValue(strategy = GenerateType.TYPE)


  • IDENTITY

    기본키 생성을 데이터베이스에 위임

    AUTO_INCREMENT

    이 전략을 사용하려면 데이터베이스로부터 기본 키값을 얻어오기 위해 추가 조회 발생

    무조건 INSERT를 한 후에 조회 가능 => 쓰기 지연 동작 X

    JDBC3에 추가된 Statement.getGeneratedKeys()를 사용하면 데이터 저장과 동시에 생성된 기본 키값도 얻어올 수 있음

    Hibernate는 이것을 이용해서 한번만 통신


  • SEQUENCE

    데이터베이스 시퀀스는 유일한 값을 순서대로 생성하는 데이터베이스 오브젝트

    이 시퀀스를 사용해서 기본 키 생성

    1. 시퀸스 생성 1 : CREATE SEQUENCE "시퀀스 명" START WITH 1 INCREENT BY 1;

    2. 시퀀스 생성 2 : @SequenceGenerator 사용

      @SequenceGenerator(
          name = "Generator 명",
          sequenceName = "매핑할 데이터베이스 시퀀스 명",
          initialValue = 1, allocationSize = 1
      )
    3. GeneratedValue 속성에

          @GeneratedValue(
              strategy = "GenerationType.SEQUENCE,
              generator = "Generator 명"
          )

      IDENTITY와 달리, persist를 호출하면 먼저 데이터베이스 시퀀스를 사용해서 식별자 조회

      조회한 식별자를 찾아서 Entity에 할당한 후에 Entity를 영속성 컨텍스트에 저장


  • TABLE

    키 생성 전용 Table을 하나 만들고 이름과 값으로 사용할 컬럼을 만들어 데이터베이스 시퀀스를 흉내내는 전략

    Table을 사용하기 때문에 모든 데이터베이스에서 사용 가능

          @TableGenerator(
              name = "Generator 명",
              table = "테이블 명"
              pkColumnValue = "Key로 사용할 column명",
              allocationSize = "증가 값"
          )

    GeneratedValue 속성에

          @GeneratedValue(
              strategy = GenerationType.TABLE,
              generator = "Generator 명"
          )

@Column


  • 객체 필드를 컬럼에 매핑

  • 가장 많이 사용되는 속성으로 name, nullable 이 있음


속성

  • name : 필드와 매핑할 테이블의 컬럼 이름 (기본값은 필드명)

  • nullable : null 값의 사용 여부를 설정 (기본값은 true)

  • unique : @Table의 uniqueConstraints와 같지만, 한 컬럼에 간단히 유니크 제약조건을 걸 때 사용

    두 컬럼 이상을 사용해서 유니크 제약조건을 걸 때는 Table.uniqueConstraints를 사용

  • length : 문자 길이 제약조건, String 에서만 사용

  • precision : 소숫점을 포함한 전체 자릿수

  • scale : 소수의 자릿수

    BigDemical 타입에서 사용, precision과 scale은 float, double 타입에는 적용이 안되며, 아주 큰 숫자나 정밀한 소수를 다뤄야할 때 사용


@Enumerated


  • enum 타입을 매핑할 때 사용

속성

  • EnumType.STRING : enum 이름을 그대로 저장, 데이터 크기가 ORDINAL에 비해 크지만, enum 순서 변경 가능

  • EnumType.ORDINAL : enum을 순서대로 숫자로 저장, 데이터 크기가 작은 대신 순서 변경 X


@Temporal


  • 날짜 타입 (Date, Calendar)을 매핑할 때 사용

속성

필수로 지정해야함

  • TemporalType.DATE

  • TemporalType.TIME

  • TemporalType.TIMESTAMP


@Transient


  • 매핑 하지 않음을 의미

  • 데이터베이스에 저장, 조회하지 않고 임시적으로 어떤 겂을 보관하고 싶을 때 사용


@Access


  • JPA 가 Entity 데이터에 접근하는 방식을 지정

  • 설정하지 않으면 @Id의 위치를 기준으로 접근 방식이 결정

  • @Id 가 필드에 있으면 필드 접근, 프로퍼티 위에 있으면 프로퍼티 접근


속성

  • AccessType.FIELD

  • AccessType.PROPERTY


0개의 댓글