@Entity(name = “디폴트는 클래스 이름”)
- @Entity가 붙은 클래스는 JPA가 관리하는 것으로, 엔티티라 부른다.
- 적용 시 주의 사항
- 기본 생성자는 필수
- final, enum, interface, inner 클래스에는 사용할 수 없다.
- 저장할 필드에 final을 사용하면 안 된다.
@Table
- 엔티티와 매핑할 데이터베이스 테이블을 지정합니다.
- 속성
- name : 매핑할 테이블 이름 ⇒ 기본값 엔티티 이름을 사용
- catalog : catalog 기능이 있는 데이터베이스에서 catalog를 매핑
- schema : 기능이 있는 데이터베이스에서 스키마를 매핑
@Id
@Column
- 객체 필드를 테이블 컬럼에 매핑한다.
- 속성
- name : 필드와 매핑할 테이블의 컬럼 이름 ⇒ 기본 값은 객체의 필드 이름
- nullable : null 값의 혀용 여부를 설정한다. ⇒ 기본 값은 true
- unique : @Table의 uniqueConstraints와 같지만 한 컬럼에 간단히 유니크 제약조건을 걸 때 사용한다. 만약 두 컬럼 이상을 사용해서 유니크 제약조건을 사용하려면 클래스 레벨에서 @Table.uniqueConstraints를 사용해야 한다.
@Enumerated
- enum 타입을 매핑합니다.
- 속성
- value : EnumType.ORDINAL(기본값): enum 순서를 데이터베이스에 저장, EnumType.STRING: enum 이름을 데이터베이스에 저장
- EnumType.ORDINAL은 enum에 정의된 순서대로 ADMIN은 0, USER는 1 값이 데이터베이스에 저장된다.
- 장점: 데이터베이스에 저장되는 데이터 크기가 작다.
- 단점: 이미 저장된 enum의 순서를 변경할 수 없다.
- EnumType.STRING은 enum 이름 그대로 ADMIN은 ‘ADMIN’, USER는 ‘USER’라는 문자로 데이터베이스에 저장된다.
- 장점: 저장된 enum의 순서가 바뀌거나 enum이 추가되어도 안전하다.
- 단점: 데이터베이스에 저장되는 데이터 크기가 ORDINAL에 비해서 크다
💡 기본값인 ORDINAL은 주의해서 사용해야 한다.
ADMIN(0번), USER(1번) 사이에 enum이 하나 추가되서 ADMIN(0번), NEW(1번), USER(2번)
로 설정되면 이제부터 USER는 2로 저장되지만 기존에 데이터베이스에 저장된 값은 여전히 1로남아 있다. 따라서 이런 문제가 발생하지 않는 EnumType.STRING을 권장한다.
@Temporal
- 날짜 타입(java.util.Date, java.util.Calendar)을 매핑할 때 사용한다.
- 속성 value ⇒ 값을 필수로 지정
- TemporalType.DATE: 날짜, 데이터베이스 date 타입과 매핑(예: 2013–10–11)
- TemporalType.TIME: 시간, 데이터베이스 time 타입과 매핑(예: 11:11:11)
- TemporalType.TIMESTAMP: 날짜와 시간, 데이터베이스timestamp 타입과 매핑(예: 2013–10–11 11:11:11)
@Temporal(TemporalType.DATE)
private Date date;
@Temporal(TemporalType.TIME)
private Date time;
@Temporal(TemporalType.TIMESTAMP)
private Date timestamp;
date date,
time time,
timestamp timestamp,
@Lob
- 데이터베이스 BLOB, CLOB 타입과 매핑한다.
- 따로 지정하는 속성은 없고 매핑 타입이 문자면 CLOB, 나머지는 BLOB
@Transient
- 이 필드는 데이터베이스에 저장하지 않고 조회하지도 않는다.
- 객체에 임시로 어떤 값을 보관하고 싶을 때 사용한다.
@Access
- 엔티티 데이터에 접근하는 방식을 설정
- AccessType.FIELD (필드 접근)
- AccessType.PROPERTY(프로퍼티 접근) : 접근자Getter를 사용한다.
- @Access를 설정하지 않으면 @Id의 위치를 기준으로 접근 방식이 설정된다.
# 필드, 프로퍼티 접근 함께 사용
@Entity
public class Member {
@Id
private String id;
@Transient
private String firstName;
@Transient
private String lastName;
@Access(AccessType.PROPERTY)
public String getFullName() {
return firstName + lastName;
}
...
}
⇒ @Id가 필드에 있으므로 기본은 필드 접근 방식을 사용하고 getFullName()만 프로퍼티 접근 방식을 사용한다. 따라서 회원 엔티티를 저장하면 회원 테이블의 FULLNAME 컬럼에 firstName + lastName의 결과가 저장
@ManyToOne
다대일 관계에서 사용한다.
| 속성 | 기능 | 기본값 |
|---|
| optional | false로 설정하면 연관된 엔티티가 항상 있어야 함 | true |
| fetch | 글로벌 페치 전략을 설정. | @ManyToOne=FetchType.EAGER |
| @OneToMany=FetchType.LAZY | | |
| cascade | 영속성 전이 기능을 사용. | - |
💡 다대일(@ManyToOne)과 비슷한 일대일(@OneToOne) 관계도 있다.
단방향 관계를 매핑할 때 둘 중 어떤 것을 사용해야 할지는 반대편 관계에 달려 있다. 반대편이 일대다 관계면 다대일을 사용하고 반대편이 일대일 관계면 일대일을 사용하면 된다.
@JoinColumn
외래키를 매핑할 때 사용한다.
| 속성 | 기능 | 기본값 |
|---|
| name | 매핑할 외래 키 이름 | 필드명 + _ + 참조하는 테이블의 기본 키 컬럼명 |
| referencedColumnName | 외래 키가 참조하는 대상 테이블의 컬럼명 | 참조하는 테이블의 기본 키 컬럼명 |
| foreignKey(DDL) | 외래 키 제약조건을 직접 지정할 수 있음 | |
| unique, nullable 등 | @Column의 속성과 같다. | |
💡 @JoinColumn 생략
@ManyToOne
private Team team;
- 기본 전략: 필드명 + _ + 참조하는 테이블의 컬럼명
- 필드명(team) + _(밑줄) + 참조하는 테이블의 컬럼명(TEAM_ID) =
⇒ team_TEAM_ID 외래 키를 사용한다.