JPA르 사용하는데 가장 중요한 일은 엔티티와 테이블을 정확히 매핑하는 것이다. 따라서 매핑 어노테이션을 숙지하고 사용해야 한다. 아래 자주 쓰이는 기본적인 엔티티 매핑 어노테이션을 정리해보았다.
@Entity
JPA를 사용해서 테이블과 매핑할 클래스는 @Entity 어노테이션을 필수로 붙여햐 한다.
@Entity가 붙은 클래스는 JPA가 관리하는 것으로, 엔티티라 부른다.
속성 | 기능 | 기본값(Default) |
name | 엔티티 이름을 지정한다. 이름이 같은 엔티티 클래스가 있다면 다른 이름을 지정해서 충돌되지 않게 해야한다. | 미 설정 시 클래스 이름을 그대로 사용 |
- 기본 생성자는 필수 (public, protected)
- final 클래스, enum, interface, inner 클래스에는 사용할 수 없다.
- 저장할 필드에 final을 사용하면 안 된다.
@Entity
public class Member {
...
}
@Table
엔티티와 매핑할 테이블을 지정한다. 생략 시 매핑한 엔티티 이름을 테이블 이름으로 사용한다.
속성 | 기능 | 기본값(Default) |
name | 매핑할 테이블 이름 | 엔티티 이름 사용 |
catalog | catalog 기능이 있는 데이터베이스에서 catalog를 매핑 | |
schema | schema 기능이 있는 데이터베이스에서 schema를 매핑 | |
uniqueConstraints (DDL) |
DDL 생성 시에 유니크 제약조건을 만든다. 2개 이상의 복합 유니크 제약조건도 만들 수 있다. 참고로 이 기능은 스키마 자동 생성 기능을 사용해서 DDL을 만들때만 사용한다. |
@Entity
@Table(name="table_member")
public class Member {
...
}
@Id, @GeneratedValue
기본키 컬럼을 지정(@Id)하고 기본키 매핑 전략을 설정(@GeneratedValue)한다.
속성 | 기능 | 기본값(Default) |
strategy | GenerationType.TABLE : 키 생성 전용 테이블을 하나 만들어서 데이터베이스 시퀀스를 흉내내는 전략(모든 데이터베이스 적용 가능) GenerationType.SEQUENCE : 데이터베이스 Sequence Object 사용 GenerationType.IDENTITY : 데이터베이스에 위임 GenerationType.AUTO : 방언에 따라 위의 세 가지 전략을 자동으로 지정 (MYSQL -> IDENTITY, 오라클 -> SEQUENCE) |
GenerationType.AUTO |
@Entity
@Table(name="table_member")
public class Member {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private long id;
}
참고
@SequenceGenerator
시퀀스를 생성한다.
속성 | 기능 | 기본값(Default) |
name | 식별자 생성기 이름 | 필수 |
sequenceName | 데이터베이스에 등록되어 있는 시퀀스 이름 | hibernate_sequence |
initialValue | DDL 생성 시에만 사용됨, 시퀀스 DDL을 생성할 때 처음 시작하는 수를 지정한다. | 1 |
allocationSize | 시쿼스 한 번 호출에 증가하는 수(성능 최적화에 사용됨) | 50 |
catalog, scheme | 데이터베이스 catalog, schema 이름 |
시퀀스 생성 DDL
create sequence [sequenceName]
start with [initialValue] increment by [allocationSize]
@Entity
@Table(name="table_member")
@SequenceGenerator(
name = "MEMBER_SEQ_GENERATOR",
sequenceName = "MEMBER_SEQ",
initialValue = 1,
allocationSize = 1
)
public class Member {
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "MEMBER_SEQ_GENERATOR")
private long id;
}
SequenceGenerator.allocationSize의 기본값이 50인것에 주의해야 한다.
스퀀스를 호출할 떄마다 값이 50씩 증가하게 된다.
데이터베이스 스퀀스 값이 하나씩 증가하도록 설정되어 있다면 반듯이 값을 1로 설정해야 한다.
@TableGenerator
키 생성 전용 테이블 생성
속성 | 기능 | 기본값(Default) |
name | 식별자 생성기 이름 | 필수 |
table | 키생성 테이블명 | hibernate_sequences |
pkColumnName | 시퀀스 컬럼명 | sequence_name |
valueColumnName | 시퀀스 값 컬럼명 | next_val |
initialValue | 초기 값, 마지막으로 생성된 값이 기준 | 0 |
allocationSize | 시쿼스 한 번 호출에 증가하는 수(성능 최적화에 사용됨) | 50 |
catalog, scheme | 데이터베이스 catalog, schema 이름 | |
uniqueConstraints (DDL) |
유니크 제약 조건을 지정할 수 있다. |
@Entity
@Table(name="table_member")
@TableGenerator(
name = "MEMBER_SEQ_GENERATOR",
table = "MY_SEQUENCES",
pkColumnValue = "MEMBER_SEQ",
allocationSize = 1
)
public class Member {
@Id
@GeneratedValue(strategy = GenerationType.TABLE, generator = "MEMBER_SEQ_GENERATOR")
private long id;
}
@Column
객체 필드를 테이블 컬럼에 매핑한다.
속성 | 기능 | 기본값(Default) |
name | 필드와 매핑할 테이블 컬럼 이름 | 객체의 필드 이름 |
insertable | false 설정 시 해당 필드는 데이터베이스에 저장되지 않는다. | true |
updatable | false 설정 시 해당 필드는 데이터데이스에 수정되지 않는다. | true |
table | 하나의 엔티티를 두 개 이상의 테이블에 매필할 때 사용 | 현재 엔티티에 매핑된 테이블 |
nullable(DDL) | null 값의 허용 여부를 설정 false 설정 시 NOT NULL 제약조건 DDL 생성 |
true |
unique(DDL) | 유니크 제약조건 설정 | |
columnDefinition (DDL) |
데이터베이스 컬럼 정보를 직접 줄 수 있다. | 필드의 자바 타입과 방언 정보를 사용해서 적절한 컬럼 타입을 생성 |
length(DDL) | 문자 길이 제약 조건 String 타입에만 사용한다. |
255 |
precision, scale (DDL) |
BigDecimal, BigInteger 타입에 사용(아주 큰 숫자나 정밀한 소수) precision은 소수점을 포함한 전체 자릿수 scale은 소수 자릿수 double, float 타입에는 적용되지 않는다. |
precision = 19 scale = 2 |
@Entity
@Table(name="table_member")
public class Member {
@Column(name = "member_name", length = 30, nullable = false)
private String memberName;
}
@Enumerated
enum 타입을 컬럼과 매핑한다.
속성 | 기능 | 기본값(Default) |
value |
EnumType.ORDINAL : enum 값의 순서를 DB에 저장
EnumType.STRING : enum 값의 이름을 DB에 저장
|
EnumType.STRING |
EnumType.ORDINAL
- 장점 : 데이터베이스에 저장되는 데이터 크기가 작다.
- 단점 : 이미 저장된 enum의 순서를 변경할 수 없다.
EnumType.STRING
- 장점 : 저장된 enum의 순서가 바뀌거나 enum이 추가되어도 안전하다.
- 단점 : 데이터베이스에 저장되는 데이터 크기가 ORDINAL에 비해서 크다.
@Entity
@Table(name="table_member")
public class Member {
@Enumerated(value = EnumType.STRING)
private MemberType memberType;
}
@Temporal
날짜 형식 컬럼에 Date 객체를 매핑
속성 | 기능 | 기본값(Default) |
@Temporal(타입) |
TemporalType.Date : 년-월-일 의 date 타입
TemporalType.Time : 시:분:초 의 time 타입
TemporalType.TIMESTAMP :date + time 의 timestamp(datetime) 타입 |
TemporalType.TIMESTAMP |
@Entity
@Table(name="table_member")
public class Member {
@Temporal(TemporalType.TIMESTAMP)
private Date createdDate;
}
@Lob
데이터베이스 BLOB, CLOB 타입과 매핑한다.
@Lob에는 지정할 수 있는 속성이 없다. 대신 매핑하는 필드 타입이 문자면 CLOB으로, 나머지는 BLOB으로 매핑한다.
- CLOB : String, char[], java.sql.CLOB
- BLOB : byte[], java.sql.BLOB
@Entity
@Table(name="table_member")
public class Member {
@Lob
private String lobString;
}
@Transient
데이터베이스 컬럼과 필드를 컬럼하지 않는다.
조회도 하지않고 저장도 하지 않기 때문에 임시로 어떤 값을 보관하고 싶을 때 사용한다.
@Entity
@Table(name="table_member")
public class Member {
@Transient
private Integer temp;
}
@Access
JPA가 엔티티 데이터에 접근하는 방식을 지정한다.
@Access가 설정되어있지 않으면 @Id의 위치를 기준으로 접근방식이 설정된다.
AccessType.FIELD - 필드에 직접 접근한다. 필드 접근 권한이 private이어도 접근할 수 있다.
@Entity
@Table(name="table_member")
@Access(AccessType.FIELD)
public class Member {
@Id
private String id;
}
AccessType.PROPERTY - 접근자(Getter)를 사용한다.
@Entity
@Table(name="table_member")
@Access(AccessType.PROPERTY)
public class Member {
private String id;
@Id
public String getId() {
return id;
}
}
필드 접근방식과 프로퍼티 접근방식을 함께 사용하는 것도 가능하다.
@Entity
@Table(name="table_member")
public class Member {
@Id // 필드 접근방식
private String id;
private String firstName;
private String lastName;
@Transient
private String fullName;
@Access(AccessType.PROPERTY) // 프로퍼티 접근방식
public String getFullName() {
return firstName + lastName;
}
}
'JPA' 카테고리의 다른 글
연관관계 설정 시 주의사항 (0) | 2021.12.30 |
---|---|
엔티티 연관 관계 매핑 어노테이션 정리 (0) | 2021.12.30 |
하이버네이트(Hidernate) 설명 및 설정법 (0) | 2021.12.28 |
엔티티 매니저와 엔티티의 영속성 관리 (0) | 2021.12.28 |
JPA란? (0) | 2021.09.16 |