[JPA] 엔티티 매핑

2022. 12. 21. 19:21DataBase/JPA

[JPA] 엔티티 매핑

 

  1. @Entity
  2. @Table
  3. 다양한 매핑 사용
  4. 데이터 베이스 스키마 자동 생성
  5. DDL 생성 기능
  6. 기본 키 매핑
  7. 필드와 컬럼 매핑 : 레퍼런스

 

@Entity

 

JPA를 사용하여 테이블을 표현할 자바 클래스는 @Entity 어노테이션을 필수로 붙여야 함

 

속성 기능  기본값
name - JPA에서 사용할 엔티티 이름 지정

- 기본값은 클래스 이름을 사용

- 프로젝트 내의 다른 패키지에 동일 이름을 가진 엔티티 클래스가 존재할 시 이름을 지정하여 충돌 방지 필수 
설정하지 않을 경우
클래스 이름 그대로 사용

 

Entity클래스 사용 - interface로 구현 / default 값은 entity class 파일과 동일

@Documented
@Target(TYPE)
@Retention(RUNTIME)
public @interface Entity {

	/**
	 * (Optional) The entity name. Defaults to the unqualified
	 * name of the entity class. This name is used to refer to the
	 * entity in queries. The name must not be a reserved literal
	 * in the Jakarta Persistence query language.
	 */
	String name() default "";
}

 

  • 기본 생성자는 필수 ( 필드가 존재하지 않은 public, protected, lombok의 @NoArgsConstructor 사용 )
  • final 클래스  enum , interface , inner 클래스 내부에는 해당 @Entity 어노테이션 사용 불가
  • 저장이 되는 필드에 final을 사용할 수 없다

 

@Table

 

해당 어노테이션은 엔티티와 매핑을 할 테이블 지정. 생략을 하면 @Entity를 테이블 이름으로 사용한다.

 

속성 기능  기본값
name - 매핑할 테이블 이름 엔티티 이름을 사용한다.
catalog  - catalog 기능이 있는
데이터베이스에서 catalog를 매핑한다.
 
schema - schema 기능이 있는
데이터베이스에서 schema를 매핑 
 
uniqueContraints - DDL 생성 시 유니크 제약 조건 만듬

- 2개 이상의 복합 유니크 제약 조건 가능

- 스키마 자동 생성 기능 사용으로 DDL 만들때만 사용
 

 

이 중 기본적으로 설정이 되는 것은 name이며 나머지 catalog / schema / uniqueConstraint는 선택이다.   

 

@Target(TYPE) 
@Retention(RUNTIME)
public @interface Table {

    /**
     * (Optional) The name of the table.
     * <p> Defaults to the entity name.
     */
    String name() default "";

    /** (Optional) The catalog of the table.
     * <p> Defaults to the default catalog.
     */
    String catalog() default "";

    /** (Optional) The schema of the table.
     * <p> Defaults to the default schema for user.
     */
    String schema() default "";

    /**
     * (Optional) Unique constraints that are to be placed on 
     * the table. These are only used if table generation is in 
     * effect. These constraints apply in addition to any constraints 
     * specified by the <code>Column</code> and <code>JoinColumn</code> 
     * annotations and constraints entailed by primary key mappings.
     * <p> Defaults to no additional constraints.
     */
    UniqueConstraint[] uniqueConstraints() default {};

    /**
     * (Optional) Indexes for the table.  These are only used if
     * table generation is in effect.  Note that it is not necessary
     * to specify an index for a primary key, as the primary key
     * index will be created automatically.
     *
     * @since 2.1
     */
    Index[] indexes() default {};
}

 

 

다양한 매핑 사용, 레퍼런스

 

  • @Enumerated
Specifies that a persistent property or field should be persisted as a enumerated type. 
The Enumerated annotation may be used in conjunction with the Basic annotation, 
or in conjunction with the ElementCollection annotation when the element collection value is of
basic type. If the enumerated type is not specified or the Enumerated annotation is not used, 
the EnumType value is assumed to be ORDINAL.

    Example:
 
    public enum EmployeeStatus {FULL_TIME, PART_TIME, CONTRACT}
 
    public enum SalaryRate {JUNIOR, SENIOR, MANAGER, EXECUTIVE}
 
    @Entity public class Employee {
        public EmployeeStatus getStatus() {...}
        ...
        @Enumerated(STRING)
        public SalaryRate getPayScale() {...}
        ...
    }

자바에서 Enum 타입으로 클래스의 필드값을 정의하고, 해당 클래스가 Entity로 명시되어 DB에 저장될 때 사용된다.

이때 EnumType.ORDINAL /  EnumType.STRING 두 개의 경우가 존재한다.

 

예시의 Enum값을 보자

 

- ORDINAL의 경우 해당 어노테이션의 순서를 숫자로 하여 DB 저장한다. 그러므로 salary rate에서 Manager로 저장을 하게 되면 3이란 숫자를 DB에 저장하게 된다.

 

- STRING의 경우 해당 Enum을 그대로 저장한다. 그러므로 똑같은 Enum을 저장하게 되면 Manager를 저장하게 된다.

 

  • @Temporal
This annotation must be specified for persistent fields or properties of type java.util.Date
and java.util.Calendar. It may only be specified for fields or properties of these types.
The Temporal annotation may be used in conjunction with the Basic annotation, 
the Id annotation, or the ElementCollection annotation when the element collection value is 
of such a temporal type.
      Example:
  
      @Temporal(DATE)
      protected java.util.Date endDate;
  
Since:
1.0

 

자바의 날짜 타입을 매핑하기 위해 사용, 예시에서 보다시피 Temporal(date) 형식으로 사용을 한다.

date / calender 객체가 들어가며 해당 date 객체에 맞춰서 매핑이 가능하다. 

 

- TemporalType.Date :  년 - 월 - 일

- TemporalType.Time :  시 : 분 : 초 

- TemporalType.TIMESTAMP : DATE + TIME의 구조

 

  • @Lob
Specifies that a persistent property or field should be persisted as a large object 
to a database-supported large object type.

Example 1:

@Lob @Basic(fetch=LAZY)
@Column(name="REPORT")
protected String report;

Example 2:

@Lob @Basic(fetch=LAZY)
@Column(name="EMP_PIC", columnDefinition="BLOB NOT NULL")
protected byte[] pic;

사이즈가 큰 데이터를 저장하기 위한 데이터 타입. varchar로 저장하기에는 크기가 크기에 CLOB, BLOB으로 지정하여 저장해야 한다. 이때 해당 어노테이션을 붙이면 이러한 CLOB, BLOB으로 매핑 가능하다.

 

  • CLOB : String, char [] , java.sql.CLOB
  • BLOB : byte [], java.sql.BLOB

 

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

 

spring.jpa.hibernate.ddl-auto= ???

 

옵션 설명
create - 기존 테이블 삭제 및 새로 생성

- Drop +  Create
create-drop - create 속성에 추가로 애플리케이션 종료 시
생성한 DDL 제거

- Drop + Create + Drop
update - 데이터베이스 테이블과 엔티티 매핑정보를
비교해서 변경사항 수정
validate - 데이터베이스 테이블과 엔티티 매핑정보를 비교해서 차이가 있으면 경고를 남기고 애플리케이션 실행 x

- 해당 부분은 DDL을 수정 X
none -  해당 기능 사용을 하지 않을 때 사용

 

  • 운영 서버에서는 사용 x
  • 개발 서버, 개발 단계에서만 사용

 

기본 키 매핑

 

@Id 어노테이션을 사용하여 회원의 기본 키를 애플리케이션에서 직접 할당할 수 있다.

아래 리스트는 기본 키 지정이 가능한 목록이다.

 

  • 자바 기본형
  • 자바 래퍼(wrapper) 형
  • String
  • java.util.Date
  • java.sql.Date
  • java.math, BigDecimal
  • java.math.BigInteger

 

또한 데이터베이스가 생성하는 값으로 사용할 수도 있다. 이때의 경우 사용하는 어노테이션이 @GeneratedValue이다.

 

Example 1:

@Id
@GeneratedValue(strategy=SEQUENCE, generator="CUST_SEQ")
@Column(name="CUST_ID")
public Long getId() { return id; }

Example 2:

@Id
@GeneratedValue(strategy=TABLE, generator="CUST_GEN")
@Column(name="CUST_ID")
Long id;

 

해당 어노테이션을 선언을 하고 안에 있는 strategy 부분에 원하는 방식의 값을 지정해주면 된다.

 

  • IDENTITY : 기본키 생성을 데이터베이스에 위임
    • MySQL /  PostgreSQL / SQL Server / DB2
    • MySQL의 경우 AUTO_INCREMENT 기능으로 데이터베이스가 기본 키 자동생성
    • 데이터베이스에 값을 저장하고 나서야 기본 키 값을 구할 수 있을 때 사용 가능
    • em.persist() 방식으로 엔티티를 저장 후에 식별자 값이 주어짐

 

  • SEQUENCE : 데이터베이스 시퀀스를 사용해 기본 키 할당 -  유일한 값을 순서대로 생성하는 데이터베이스 오브젝트
    • 시퀀스를 사용해 기본 키 생성
    • 오라클 / PostgreSQL / DB2 / H2 DB
    • 사용하게 될 DB의 시퀀스를 매핑
    • @GeratedValue(strategy = GenerationType.SEQUENCE, generator = "BOARD_SEQ_GENERATOR")
    • 시퀀스 생성기를 generator로 지정해줘야 함
    • em.persist()를 호출할 때 먼저 식별자를 조회하고 해당 식별자에 Entity를 저장(영속성 컨텍스트)
    • 트랜잭션 커밋 후 플러시 진행 후에 DB 저장
  • TABLE : 키 생성 테이블 사용
    • 키 생성 전용 테이블을 만들고 이름과 값으로 사용할 컬럼을 만들어 데이터베이스 시퀀스 흉내
    • 테이블 사용으로 인해 모든 DB에서 적용 가능
    • 데이터베이스 시퀀스 생성용 테이블에서 식별자 값을 획득한 후 영속성 컨텍스트에 저장

 

출처

https://search.shopping.naver.com/book/catalog/32436007738?query=JPA&NaPm=ct%3Dlbrg4a2o%7Cci%3Dc37e720f677a5ee6a1cab24a5ac6310604174440%7Ctr%3Dboksl%7Csn%3D95694%7Chk%3D10939d30c99a3453028acd4f2963dac798edffde 

 

자바 ORM 표준 JPA 프로그래밍 : 네이버 도서

네이버 도서 상세정보를 제공합니다.

search.shopping.naver.com

 

 

'DataBase > JPA' 카테고리의 다른 글

[JPA]@Transactional이란  (0) 2024.09.24
[ETC] Fetch 옵션  (0) 2023.08.28
[JPA] 영속성 관리  (0) 2022.12.19