일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | |
7 | 8 | 9 | 10 | 11 | 12 | 13 |
14 | 15 | 16 | 17 | 18 | 19 | 20 |
21 | 22 | 23 | 24 | 25 | 26 | 27 |
28 | 29 | 30 |
- Java
- 프로그래머스
- BFS
- python3
- 소수찾기
- mvc
- pypy3
- Python
- spring
- c#
- 1일1솔
- 백준
- LCM
- popleft
- 그리디 알고리즘
- 누적합
- C#강의
- 소수판별
- 인프런
- 연관관계
- JPA
- 파이썬
- 우선순위큐
- 합 구하기
- deque
- DP
- unity
- 브루투포스
- appendleft
- 완전탐색
- Today
- Total
jae_coding
[Spring JPA] 엔티티 매핑 본문
목차
- 객체와 테이블 매핑
- DB 스키마 자동 생성
- 필드와 컬럼 매핑
- 기본 키 매핑
0. 앤티티 매핑
- 객체와 테이블 매핑: @Entity, @Table
- 필드와 컬럼 매핑: @Column
- 기본 키 매핑: @Id
- 연관관계 매핑: @ManyToOne, @JoinColumn
1. 객체와 테이블 매핑
@Entity
- @Entity가 붙은 클래스는 JPA가 관리하는 엔티티이다.
- JPA를 사용해서 테이블과의 매핑할 클래스는 @Entity 어노테이션을 꼭 붙여야한다.
- 주의사항
1) 기본 생성자 필수 (parameter가 없는 public or protected 생성자)
2) final class, enum, interface, inner class 에는 사용할 수 없다.
3) 저장할 필드에는 final을 사용할 수 없다.
@Table
- name: 매핑할 테이블 이름 (default: 엔티티 이름)
- catalog: 데이터베이스 catalog 매핑
- schema: 데이터베이스 schema 매핑
- uniqueConstratints (DDL): DDL 생성 시, 유니크 제약 조건 생성
2. DB 스키마 자동 생성
- DDL을 애플리케이션 실행 시점에 자동으로 생성
- 데이터베이스 dialect를 활용하여 데이터베이스에 맞는 적절한 DDL 생성
<property name="hibernate.hbm2ddl.auto" value="create" />
hibernate.hbm2ddl.auto
- create: 기존 테이블 삭제 후 다시 생성 (DROP + CREATE)
- create-drop: create와 같으나 종료시점에 테이블 DROP
- update: 변경분만 반영 (운영 DB에는 사용하면 안된다) + column을 추가하는 것만 되고, 지우는 것은 안된다.
- validate: 엔티티와 테이블이 정상 매핑되었는지만 확인
- none: 사용하지 않음
주의점
- 운영 장비에는 절대 create, create-drop, update를 사용하면 안된다.
- 개발 초기 단계: create, update
- 테스트 서버: update, validate
- 스테이징, 운영서버: validate, none
- 이렇게 생성된 DDL은 개발 장비에서만 사용하는 것을 권장
- 생성된 DDL은 운영서버에서는 사용되지 않거나, 적절히 다듬은 후 사용
- 테이블 중심 👉객체 중심
- DDL 생성기능: DDL을 자동 생성할 때만 사용되고, JPA의 실행로직에는 영향X
- 제약조건 추가: 회원이름은 필수, 10글자 초과X
@Column(nullable=false, length=10)
private String name;
- 유니크 제약조건 추가
@Table(uniqueConstraints={@UniqueConstraint(name="NAME_AGE_UNIQUE", columnNames={"NAME", "AGE})})
3. 필드와 컬럼 매핑
Member Entity
package hellojpa;
import javax.persistence.*;
import java.util.Date;
@Entity
public class Member {
@Id
private Long id;
@Column(name = "name")
private String username;
private Integer age;
// enum타입이 db에는 없기때문에 Enumerated가 필요
@Enumerated(EnumType.STRING)
private RoleType roleType;
// 날짜타입을 이용하기 위함
@Temporal(TemporalType.TIMESTAMP)
private Date createdDate;
@Temporal(TemporalType.TIMESTAMP)
private Date lastModifiedDate;
//db의 큰 컨텐츠를 넣고싶을때 사용
@Lob
private String description;
public Member() {
}
}
매핑 어노테이션 정리
- @Column: 컬럼 매핑
- @Temporal: 날짜 타입 매핑
- @Enumerated: enum타입 매핑
- @Lob: BLOB, CLOB 매핑
- @Transient: 트정 필드를 컬럼에 매핑하지 않음(매핑 무시)
@Column 속성
@Enumerated속성
기본이 ORDINAL이지만 순서를 저장하기에 STRING타입을 사용하는 것을 권장
@Temporal 속성
LocalDate, LocalDateTime을 사용할 때는 생략이 가능하다. (최신 하이버네이트 지원) 따라서 지금은 거의 사용을 안한다.
@Lob
매핑 필드 타입이 문자면 CLOB, 나머지 BLOB
- CLOB: String, char[], java.sql.CLOB
- BLOB: byte[], java.sql.BLOB
@Transient
메모리 상에서 임시로 어떤 값을 보관하고 싶을때 사용
4. 기본 키 매핑
@Id @GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
직접 할당 👉 @Id 만 사용
자동 생성 👉 @GeneratedValue까지 사용
- IDENTITY: 데이터베이스에 위임 (ex, MYSQL의 AUTO_INCREMENT)
- SEQUENCE: 데이터베이스 시퀀스 오브젝트 사용 (ORACLE) <@SequenceGenerator 필요>
- TABLE: 키 생성용 테이블 사용, 모든 DB 사용 <@TableGenerator 필요>
- AUTO: dialect에 따라 자동 지정
식별자 전략
- DB PK 조건: null x, 유일, 변하면 안된다.
- 변하면 안된다는 조건 👉 미래까지 생각해야하기 때문에 만족하는 자연키(예: 주민등록번호) 를 찾기가 어렵다. 대리키나 대체키를 사용해야한다.
- 권장: Long타입 + 대체키 + 키 생성전략 사용
'Spring, java > Spring_JPA' 카테고리의 다른 글
[Spring JPA] 다양한 연관관계 매핑 (N:1, 1:N, 1:1, N:M) (0) | 2022.09.10 |
---|---|
[Spring JPA] 연관관계 매핑 (0) | 2022.09.10 |
[Spring JPA] 영속성 관리 (영속성 컨텍스트) (0) | 2022.09.08 |
[Spring JPA] Hello 순수JPA (0) | 2022.09.08 |
[Spring JPA] SQL 개발의 단점 및 JPA (0) | 2022.09.08 |