반응형
Entity class Annotation
@Entity
- 정의 : 테이블과 Entity class를 연결해주는 필수 annotation
1. 속성
- name
- 기능
- jpa에서 사용할 Entity이름을 설정
- 다른 package에서 같은 Entity이름을가지고 있음 하나는 변경 해야함
- 기본값
- class이름 그대로 사용
2. 특징
- 기본 생성자 필수
- 접근제어 지시자 최소 단위 : protected
- private 사용 금지
- final class, enum, interface, inner class 사용 불가
- 저장할 field는 final 사용 금지
@Table
- 정의 : 엔티티 클래스와 mapping할 table을 지정하는 annotation1. 속성
1. 속성
- name
- 기능 : table이름
- 기본값 : entity 이름
- catalog
- 기능 : catalog 명설정(시스템 내의 모든 객체에 대한 정의나 명세)
- 기본 값 : 없음
- schema
- 기능 : schema를mapping
- 기본 값 : 없음
- uniqueConstraints
- 기능 : DDL 전용으로 유니크 제약조건을 2개 이상의 컬럼을 설정 할 때 사용, DDL 때만 사용
- 기본 값 : 없음
@Id
- 정의 : 기본키 mapping
1. @Id 필드 할당 방법
- 직접 할당 : 애플리케이션에서 자동으로 할당
- 영속성 컨택스트에 Id로 설정된 Entity가 없을 경우 Exception 발생
- 간접 할당 : 대리키 사용
- IDENTITY
- 정의 : 기본키 설정을 DB에 위임
- AUTO_INCREMENT 기능
- Entity 객체를 DB 에 저장하고, 저장된 row를 조회해서 반환 하는 방식을 취합니다.
- 영속성 컨택스트에 저장하기 위해서(PK값 이 없기 때문) 쓰기 지연하지 않고 바로 insert query 실행
- JDBC3에 Statement.getGeneratedKeys()를 사용해게되면, 데이터를 저장하면서 동시에 생성된 기본키 값을 얻어올 수 있음
- SEQUENCE
- 정의 : 시퀀스를 사용해서 기본키 설정
- DB Sequence : 유일한 값을 순서대로 생성하는 특별한 DB Object
- PostreSQL, DB2, H2에 사용 가능
- 저장 실행 순서 : 시퀀스에 식별자 조회 -> 조회한 PK값을 정보 엔티티 할당하고 영속성 컨택스트에 저장 -> flush가 발생할 때 실제 DB에서 정보 저장
- @SequenceGenerator
- 정의 : sequence 생성기를 등록
- 속정
- name : 식별자 이름, 필수 사항
- sequenceName : DB에 등록할 시퀀스 이름
- initialValue : DDL 생성시 사용, 처음 시작할 시퀀스 번호 -> default : 1
- allocationSize : 시퀀스가 한번 사용될때 증가하는 횟수(성능 최적화에 사용) -> default : 50
- catalog, schema : DB 카탈로그, 스키마 이름
- allocationSize의 default가 50인 이유 : 한번의 sequece에서 데이터를 조회 하지만 나머지는 memory에서 할당을 하기 위해서 -> 처음 50 ~ 100 application 1 에서 사용, 100 ~ 150은 application 2에서 할당하게 해서 동시성제어와 속도를 높이기 위해서 사용한다.
@Entity
public class user {
@Id
@GenerateValue(strategy = GenerationType.SEQUENCE, generator = "USER_SEQ_GENERATOR")
@SequenceGenerator(name="sequence", allocationSize = 20)
private Long id;
// ...
}
- TABLE
- 정의 : Key전용 테이블을 이용해서 기본키 설정
- @TableGenerator
- 정의 : table key 생성기를 등록
- 속성
- name : 식별자 생성기 이름, 필수 사항
- table : key 생성 table 이름 -> default : hibernate_sequences
- pkColumnName : 시퀀스 컬럼명 -> default : sequence_name
- valueColumnName : 시퀀스 값 컬럼명 -> default : next_val
- pkColumnValue : 키로 사용할 값 이름 -> default : eneity 이름
- initalValue : 초기 값, 마지막으로 생성된 값이 기준 -> default 0
- allocationSize : 시퀀스 한번 호출에 증가하는 수(성능 최적화 용도) -> default : 50
- catalog, schema : db 카탈로그, 스키마 이름
- uniqueConstraints(DDL 전용) : 유니크 제약 조건 지정 할 수 있음
create table sequences (
sequence_name varchar(255) not null primary key,
next_val bigint
);
@Entity
@TableGenerator(
name = "USER_SEQ_GENERATOR",
table = "sequences",
pkColumnValue = "user_seq_id", allocationSize = 1
)
public class User {
@Id
@GeneratedValue(strategy = GenerationType.TABLE,
generator = "USER_SEQ_GENERATOR"
)
private Long id;
// ...
}
- AUTO
- 정의 : 선택한 DB종류에 따라서 자동으로 설정됨
- 특징
- @GeneratedValue.strategy 의 default 값은 AUTO입니다.
- 프로토 타입 상태에서는 사용하기 편리
2. 기본키 생성 전략 설정
- @GeneratedValue 추가해서 사용
3. 기본키 특징
- 식별자 전략
- null 허용하지 않음
- 유일한 값
- 변하지 않는 값
- 기본키 설정
- 자연키
- 비즈니스에 의미가 있는 키
- ex) 주민번호, email
- 대리키(대체 키)
- 비즈니스와 관련 없이 만들어진 키
- oracle의 시퀀스, mysql 의 auot_increment, 키생성 테이블 ...etc
- 권장 사항 : 대리키를 권장 -> 언제나 비즈니스로 로직이 변경될 가능성이 존재 하기 때문에
code
@Entity
@Table(name="users", uniqueConstraints = {
@UniqueConstraint {
name = "email_username_unique",
columnNames = { "email", "username" }
}
})
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String username;
private String email;
}
필드 컬럼 매핑 Annotaition
DDL 필드 옵션
- 장점 : Entity class만 보고 table에 제약 조건을 확인할 수 있음
@Column
1. 정의
- 컬럼에 설정할 정보
2. 속성
- name
- 기능
- 필드의 이름
- 기본값 : 객체의 필드 이름
- insertable
- 기능
- entity 저장시 이필드도 같이 저장
- false면 읽기 전용
- 잘 사용하지 않음
- 기본값 : true
- updatable
- 기능
- Entity 수정시 같이 수정되는 것
- false일경우 한번 저장된 정보는 수정되지 않는다
- 거의 사용하지 않음
- 기본값 : true;
- table
- 기능
- 하나의 entity가 2개 이상의 테이블에 mapping될 때 사용
- 거의 사용하지 않음
- 기본값 : 현재 table이 연결된 table명
- nullable (DDL)
- 기능
- not null 설정
- 만약 int, long과 같은 primitive type을 사용할 경우 default 값이 존재하므로, nullable을 false로 설정하는게 좋음
- 기본값 : true
- unique(DDL)
- 기능
- 한 컬럼에 대해서만 unique key를 설정할 때 사용
- columnDefinition(DDL)
- 기능
- DB의 컬럼 정보 직접 입력
- 기본값 : 자바의 field 변수의 type에 맞춰서 mapping
- length
- 기능
- 문자열 일 경우 길이 정보
- 기본값 : 255
- precision, scale(DDL)
- 기능
- BigDecimal 타입에서 사용
- precision : 소수점 포함한 전체 자릿수
- scale : 소수의 자리수
- 기본값
- prevision : 19
- scale : 2
@Enumerated
1. 정의
- enum type을 mapping할 때 사용
2. 속성
- value
- 기능
- EnumType.ORGINAL : enum선언 순서 index 정보 저장
- EnumType.STRING : enum의 이름을 저장
- 기본값 : EnumType.ORGINAL
- EnumType.ORGINAL
- 장점 : 데이터 크기가 작아짐
- 단점 : enum 저장된 순서를 꼐속 신경써 줘야함
- 3. 특징
@Temporal
1. 정의
- 날짜 정보 mapping
2. 속정
- value
- 기능
- TemporalType.Date : 날짜 정보, DB의 date type
- TemporalType.TIME : 시간 정보, DB의 time type
- TemporalType.TIMESTaMP : 날짜와 시간 정보, DB의 timestamp
- TemporalType을 필수로 지정해야함
@Lob
1, 정의
- DB에 BLOB, CLOB타입에 매핑하기 위한 것 -> 대규모 string 정보를 저장하기 위한 것
@Transient
1. 정의
- table에 mapping 하지 않는 field를 찾기 위한 것
- 임시 값에 주로 사용
@Access
1. 정의
- Entity객체가 Table에 접근하는 방식
2. 특징
- 필드 접근 : AccessType.FIELD일경우 필드 값으로 저장 -> private라도 접근 가능
- 프로퍼티 접근 : AccessType.PROPERTY, getter를 사용
- @Access 설정하지 않음 @Id의 위치를 기준으로 접근 방식이 설정
반응형
'JPA > ORM 표준 JPA' 카테고리의 다른 글
06 연관관계 Mapping 종류 (2) | 2021.08.21 |
---|---|
05 연관관계 (0) | 2021.07.28 |
03. 영속성 (0) | 2021.06.30 |
02. JPA 요소들 (2) | 2021.06.29 |
01. JPA 소개 (0) | 2021.05.19 |