엔티티 맵핑(1) - slahsk/study GitHub Wiki

엔티티 맵핑(1)

  • 객체와 테이블맵핑 : @Entity, @Table
  • 기본 키 맵핑 : @Id
  • 필드와 컬럼 맵핑 : @Column
  • 연관관계 맵핑 : @ManyToOne, @JoinColumn

@Entity

JPA를 사용해서 테이블과 맵핑할 클래스는 @Entity 러노테이션을 필수로 붙여야 한다.

  • 기본 생성자 필수
  • final 클래스, enum, interface, inner 클래스에 사용할 수 없다.
  • 저장할 필드에 final을 사용하면 안된다.

@Table

엔티티와 맵핑할 테이블 지정

생략하면 맵피안 엔티티 이름을 테이블 이름으로 사용.

기본 키 맵핑

@Id 사용하면 애플리케이션에서 직접 해야한다.

자동 생성 잔략을 사용하라면 @Id @GeneratedValue 같이 사용 하면 된다.

@GeneratedValue 생성 전략은 다음과 같다.

IDENTITY (기본 키 생성을 데이터베이스에 위임한다)

주로 MySQL, PostgreSQL, SQL Server, DB2에서 사용한다.

@Entity
public class Board{
  @id
  @GenerateValue(strategy = GenerationType.IDENTITY)
  private Long id;
  ...
}
Board board = new Board();
//board.getId() 값 = 0(기본값);
em.perist(board);
//board.getId() 값 = 1;
//데이터베이스가 생성한 값을 JPA가 조회한 것이다.

em.perist(board) 를 호출하는 즉시 INSERT SQL이 데이터베이스에 전달 된다. 엔티티를 데이터베이스에 저장한 후에 식별자를 조회해서 엔티티의 식별자에 할당한다.

따라서 이 전략은 트랜잭션을 지원하는 쓰기 지연이 동작하지 않는다.

SEQUENCE (데이터베이스 시퀀스를 사용해서 기본 키를 할당한다)

ORACLE, PostgreSQL, DB2, H2 사용할 수 있다.

@Entity
public class Board{
  @id
  @GenerateValue(strategy = GenerationType.SEQUENCE,
                generator = "BOARD_SEQ_GENERATOR")//시퀀스 이름
  private Long id;
  ...
}

em.perist(board) 를 호출할 때 먼저 데이터베이스 시퀸스를 사용해서 식별자를 조회한다.

그리고 조회한 식별자를 엔티티에 할당한 후에 엔티티 영속성 컨텍스트에 저장한다.

TABLE (키 생성 테이블을 사용한다)

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

  create table MY_SEQUENCE(
    sequence_name varchar(255) not null,
    next_val bigint,
    primary key (sequence_name)
  )
@Entity
@TableGenerator(
  name = "BOARD_SEQ_GENERATOR",
  table = "MY_SEQUENCE",
  pkColumnValue = "BOARD_SEQ", //sequence_name
  allcationSize = 1) //증가하는 수
public class Board{
  @id
  @GenerateValue(strategy = GenerationType.TABLE,
                generator = "BOARD_SEQ_GENERATOR")//시퀀스 이름
  private Long id;
  ...
}

AUTO

@Entity
public class Board{
  @id
  @GenerateValue(strategy = GenerationType.AUTO)
  private Long id;
  ...
}

데이터베이스 방언에 따라 IDENTITY, SEQUENCE, TABLE 전략 중 하나를 자동으로 선택한다.

예를 들어 ORACLE 은 SEQUENCE, MySQL은 IDENTITY를 사용한다.

AUTO를 사용할 때 SEQUENCE, TABLE 전략이 선택되면 미리 만들어 두어야 한다.