엔티티 맵핑(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 전략이 선택되면 미리 만들어 두어야 한다.