엔티티 매핑 소개
- 객체와 테이블 매핑: @Entity, @Table
- 필드와 컬럼 매핑: @Column
- 기본 키 매핑: @Id
- 연관관계 매핑: @ManyToOne, @JoinColumn
@Entity
- JPA가 관리하는 클래스, 엔티티라고 함
- 기본 생성자 필수 (public or protected 생성자): 스펙상 필요함 (객체를 프록싱하기 위해)
- final class, enum, interface, inner class 사용 불가
- 저장할 필드에 final 사용 불가
@Table
- 엔티티와 매핑할 테이블 지정
- 속성
- name: 매핑할 테이블 이름 -> 기본값: 엔티티 이름을 사용
데이터베이스 스키마 자동 생성
- DDL을 애플리케이션 실행 시점에 자동 생성
- 테이블 중심 -> 객체 중심
- 데이터베이스 방언을 활용해 적절한 DDL 생성
- 생성된 DDL은 개발 장비에서만 사용
- 속성
- create (drop + create)
- create-drop: 종료 시점에 drop
- update: 변경 부분만 반영
- validate: 엔티티와 테이블이 정상 매핑됐는지만 확인
- none
- 운영 장비에는 절대 create, create-drop, update 사용하면 안 됨!
@Column
- ex) @Column(unique = ture, lenth = 10): 테이블에 영향을 줌 (DDL 생성에만 영향을 줌)
필드와 컬럼 매핑
- ex) @Column(name = "name"): 객체명과 데이터베이스 컬럼명이 다를 때
- 데이터베이스에서는 Date, Time, Timestamp 세 가지를 구분하기 때문에 매핑 정보를 제공해야 함
- ex) @Temporal(TemporalType.YIMESTAMP)
- @Lob: varchar를 넘는 큰 데이터
- String 타입일 경우 자동으로 clob으로
- @Transient: 메모리에서만 사용하겠다!
@Column 속성
- name: 필드와 매핑할 테이블 컬럼 이름
- insertable, updatable: 등록, 변경 가능 여부
- nullable: false일 경우 not null 조건이 적용됨
- unique: 유니크 제약 조건
- 이름이 랜덤으로 적용됨 -> 운영에서는 사용 안 함
- @Table(uniqueConstraints = ??): 유니크 제약조건 이름 지정 가능
- columnDefinition: 데이터베이스 컬럼 정보 직접 줄 수 있음
- precision, scale(DDL): BigDecimal 타입에서 사용 (BigInteger도 사용 가능)
@Enumerated
- EnumType.ORDINAL: enum 순서를 데이터베이스에 저장 (기본값) -> 사용❎
- EnumType.STRING: enum 이름을 데이터베이스에 저장
기본키 매핑
- @Id: 직접 할당
- @GeneratedValue: 자동 생성
- ex) @GeneratedValue(strategy = GenerationType.AUTO): 데이터베이스 방언에 맞게 자동으로 지정
- IDENTITY: 데이터베이스에 위임 (MYSQL - autoIncrement)
- SEQUENCE: 시퀀스오브젝트를 통해 값을 가져와서 세팅함
- Long 사용: 10억 넘어가면 타입을 바꾸기 힘듦
- TABLE: 키 생성 전용 테이블 만들어서 데이터베이스 시퀀스 흉내냄, 성능 이슈 발생
식별자 전략
- 기본키 제약 조건: NULL 아님, 유일, 변하면 안 됨
- 자연키 찾기 어려움, 대리키 사용함
- 권장: Long형 + 대체키 + 키 생성 전략
- 영속성 컨텍스트 @Id에 pk가 들어가는데 identity 전략을 사용하면 데이터베이스에 값이 들어가면 pk를 알 수 있음
- em.persist() 호출하는 시점에 insert query가 날아감
- sequence 전략을 사용할 때 트랜잭션 commit 시점에 insert query가 날아감