1. 객체와 테이블 매핑
@Entity
JPA 를 사용해서 테이블과 매핑할 클래스는 @Entity 어노테이션을 반드시 붙여줘야 한다.
@Entity 가 붙은 클래스는 JPA 가 관리하는 것으로 엔티티라 부른다.
---- @Entity 속성 종류 -----
- name 속성
JPA 에서 사용할 엔터티 이름을 지정한다.
기본값으로 클래스 이름을 사용.
✔️ @Entity 적용시 주의사항
- 기본 생성자는 필수.
- final 클래스, enum, interface, inner 클래스에는 사용할 수 없다.
- 저장할 필드에 final 을 사용하면 안된다
@Table
엔티티와 매핑할 테이블을 지정한다. 생략할 경우 엔터티 이름을 테이블 이름으로 사용한다.
2. 기본 키 (Primary Key)매핑
@Id@Entity public class Member { @Id // Id 어노테이션만 사용해서 회원의 기본 키를 애플리케이션에서 직접 할당. @Column(name= "ID) private String id; }❗️ 기본 키를 애플리케이션에서 직접 할당하는 대신, 데이터베이스가 생성해주는 값을 할당하는 방법
1. 직접 할당 : 기본 키를 애플리케이션에서 직접 할당한다 .
2. 자동 생성 : 대리 키 사용 방식1. IDENTITY 전략
- 기본 키 생성을 데이터베이스에 위임한다.
- 데이터베이스에 값을 저장하고 나서야 기본 키 값을 구할 수 있을 때 사용한다.
- 데이터 베이스에 엔터티를 저장해서 식별자 값을 획득한 후 영속성 컨텍스트에 저장한다.
GeneratedValue(strategy = GenerationType.INDENTITY)
2. SEQUENCE 전략
- 데이터베이스에 시퀀스를 사용해서 기본키를 할당한다
- 데이터 베이스 시퀀스는 유일한 값을 순서대로 생성하는 특별한 데이터베이스 오브젝트다.
- 데이터베이스 시퀀스에서 식별자 값을 획득한 후 영속성 컨텍스트에 저장.
GeneratedValue(strategy = GenerationType.SEQUENCE)
3. TABLE 전략
- 키 생성 테이블을 사용한다.
- TABLE 전략은 키 생성 전용 테이블을 하나 만들고 여기에 이름과 값으로 사용할 칼럼을 만들어 데이터베이스 시퀀스를 흉내내는 전략.
- 데이터 베이스 시퀀스 생성용 테이블에서 식별자 값을 획득한 후, 영속성 컨텍스트에 저장.
GeneratedValue(strategy = GenerationType.TABLE)
4. AUTO 전략
- 데이터베이스 방언에 따라 IDENTITY, SEQUENCE, TABLE 전략 중 하나를 자동으로 선택.장점) 데이터 베이스를 변경해도 코드를 수정할 필요가 없다는 것. 특히 키 생성 전략이 아직 확정되지 않은 개발 초기 단계나, 프로토 타입 개발시 편리하게 사용할 수 있다.
// IDENTITY 매핑 코드 @Entity public class Board { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; } // IDENTITY 사용 코드 private static void logic(EntityManager em) { Board board = new Board(); em.persist(board); System.out.println("board.id = " + board.getId()); }em.persist() 를 호출해서 엔터티를 저작한 직후에 할당된 식별자 값을 출력했다.
출력된 값 1은 저장 시점에 데이터베이스가 생성한 값을 JPA 가 조회한 것.IDENTITY 식별자 생성 전략은 엔터티를 데이터베이스에 저장해야 식별자를 구할 수 있으므로 em.persist() 를 호출하는 즉시 INSERT SQL 이 데이터베이스에 전달된다.
따라서 이 전략은 트랜잭션을 지원하는 쓰기 지연이 동작하지 않는다.
먼저 엔터티를 데이터베이스에 저장한 후에 식별자를 조회해서 엔터티의 식별자에 할당한다.
// 시퀀스 매핑 코드 @Entity @SequenceGenerator( name = "BOARD_SEQ_GENERATOR", sequenceName = "BOARD_SEQ" // 매핑할 데이터의 시퀀스 이름 initialValue = 1, allocationSize = 1 ) public class Board { @Id @GeneratedValue(strategy = GenerationType.SEQUENCE , generator = "BOARD_SEQ_GENERATOR") private Long id; } // 시퀀스 사용 코드 private static void logic(EntityManager em) { Board board = new Board(); em.persist(board); System.out.println("board.id = " + board.getId()); }SEQUENCE 전략은 em.persist() 를 호출할 때 먼저 데이터베이스 시퀀스를 사용해서 식별자를 조회한다. 그리고 조회한 식별자를 엔터티에 할당한 후에 엔터티를 영속성 컨텍스트에 저장한다. 이후 트랜잭션을 커밋해서 플러시가 일어나면 엔터티를 데이터 베이스에 저장한한다.
3. 필드와 컬럼 매핑 : 레퍼런스
@Column - 컬럼을 매핑
@Column 은 객체 필드를 테이블 컬럼에 매핑한다.
4. 연관관계 매핑
@Many To One
@JoinColumn