프로그래밍/JPA
엔티티 맵핑
seungdols
2022. 10. 23. 21:58
Entity Mapping
- 객체와 테이블: @Entity, @Table
- 필드와 컬럼: @Column
- 기본키: @Id
- 연관관계: @ManyToOne, @JoinColumn
@Entity
- 해당 어노테이션이 붙으면 JPA가 관리
- 기본 생성자 필수
- final 클래스, enum, interface, inner 클래스 사용 X
- 저장할 필드에 final 사용 X
@Table
- name: 매핑할 테이블 이름
- catalog: 데이터베이스 catalog 매핑
- schema: 데이터베이스 schema 매핑
- DDL 유니크 제약 조건
데이터베이스 스키마 자동생성
- DDL을 어플리케이션 실행 시점에 자동 생성
- 테이블 중심 -> 객체 중심
- 이런 DDL은 개발장비에서만 사용
hibernate.hbm2ddl.auto
운영장비에는 절대로 create, create-drop, update 사용하면 안된다.
- create (drop + create)
- create-drop (종료시점 drop)
- update (변경분만 반영)
- validate (엔티티와 테이블 정상 매핑인지 확인)
- none
스테이징과 운영서버는 validate, none을 써야 한다.
DDL 생성기능
@Column(nullable=true, length=10)
- unique도 조건을 줄 수 있음.
@Table
- uniqueConstraints 추가 가능
DDL 생성기능은 DDL을 자동 생성할 때만 사용되고, JPA의 실행 로직에는 영향을 주지 않는다.
@Column
의 속성
- name
- insertable/updatable
- nullable
- unique
- column에서는 제약 조건 이름이 랜덤 문자열로 생성 되어 잘 안쓰고 쓸일이 있다면, Class Entity 레벨에서 이름을 주고 쓰는게 좋다.
- columnDefinition
- length
- precision/scale
Enumerated
의 주의 사항
- value: ordinal 절대 사용 X
- EnumType.ORDINAL
- enum 순서를 저장
- EnumType.STRING
- enum 이름을 저장
- EnumType.ORDINAL
@Temporal
날자 타입을 매핑할 때 사용, LocalDate, LocalDateTime을 사용할 때는 생략가능(최신 하이버네이트)
- value
- TemporalType.DATE
- TemporalType.TIME
- TemporalType.TIMESTAMP
@Lob
- 지정할 수 있는 속성이 없음
- 매핑하는 필드 타입이 문자면 CLOB 매핑, 나머지는 BLOB 매핑
@Transient
- 필드 매핑 안됨.
- 메모리 상에서 임시로 어떤 값을 보관하고 싶을 때 사용함.
기본 키 매핑
@GeneratedValue
- IDENTITY
- DB에 위임, MYSQL
- SEQUENCE
- 시퀀스 오브젝트 사용, ORACLE
- @SeqeunceGenerator 필요
- TABLE
- 키 생성용 테이블 사용
- 모든 DB 사용
- 다만, 성능의 단점이 존재
@TableGenerator
- AUTO
식별자 전략
- 기본이 제약 조건: null 아님, 유일, 변하면 안된다.
- 미래까지 조건을 만족하는 자연키는 찾기 어렵다.
- 권장: Long + 대체키 + 키 생성 전략 사용
INDENTITY 전략
- 기본 키를 DB에 위임 했기 때문에, INSERT SQL 시점에만 기본키를 알 수 있음.
- 그래서, commit 시점이 아닌, persist 하는 시점에 INSERT SQL이 전송 된다.
반응형