728x90

@Entity

@Entity
public class Member {  }

테이블과 매핑할 클래스는 해당 어노테이션을 필수로 붙여야 한다.

속성

name

기본값은 클래스명을 사용하며, 직접 지정도 가능하다.

주의사항

기본 생성자는 필수다.

final 클래스, enum/interface/inner 클래스에는 사용할 수 없다.

필드에도 final을 사용하면 안 된다.

 

@Table

@Entity
@Table(name = "Member", uniqueConstraints = {@UniqueConstraint (name = "NAME_AGE_UNIQUE", columnNames = {"NAME", "AGE"})})
public class Member {  }

엔티티와 매핑할 테이블을 지정하는 어노테이션이다.

생략 시 엔티티 이름을 테이블로 사용한다.

속성

name

매핑할 테이블의 이름을 지정하는 속성으로 기본값은 엔티티 이름을 사용

catalog

카탈로그 기능이 있는 데이터베이스에서 카탈로그를 매핑

schema

스키마 기능이 있는 데이터베이스에서 스키마를 매핑

uniqueConstraints

DDL 생성 시에 유니크 제약조건을 만든다. 2개 이상의 복합 유니크 제약 조건도 생성 가능

스키마 자동 생성 기능으로 DDL을 만들 때만 사용

@ID

기본 키를 매핑할 때 사용하는 어노테이션

기본 키 생성 전략

직접 할당

기본 키를 애플레이케션에서 직접 할당

@Id 어노테이션만 사용

@Id
@Column(name = "ID")
private String id;

자동 생성

대리 키를 사용하는 방식

@Id 어노테이션과 @GeneratedValue 어노테이션을 사용

  • IDENTITY : 기본 키 생성을 데이터베이스에 위임(MySQL, PostgreSQL, SQL Server에서 사용)
    • 만약 MySQL의 기본키 속성에 AUTO_INCREMENT가 할당되어 있다면 해당 속성을 사용
    • 데이터베이스에 값을 저장한 후에 기본 키를 알 수 있음
    • 기본 키 값을 얻어오기 위해 데이터베이스의 추가적인 조회가 필요
    • 영속 상태가 되기 위해선 식별자 값이 필요하기 때문에 쓰기 지연이 적용되지 않음
    • 기본적으로 통신 횟수가 2회
    • 하이버네이트는 JDBC3에 추가된 Statement.getGeneratedKey 메서드를 사용하여 한 번만 통신
@Id
@Column(name = "ID")
@GeneratedValue(startegy = GenerationType.IDENTITY)
private String id;
  • SEQUENCE : 데이터베이스 시퀀스를 사용해서 할당 (Oracle, PostgreSQL, DB2, H2)
    • 유일한 값을 순서대로 생성
    • 사용하기 위해 시퀀스를 매핑해야 함
    • IDENTITY와 비슷하지만 식별자를 조회한 후에 엔티티에 할당한다.
    • 그렇기 때문에 영속성 컨텍스트에 저장이 가능하다.
    • 영속성 컨텍스트를 사용할 수 있기 때문에 쓰기 지연 기능 사용 가능
    • 데이터베이스의 시퀀스를 조회하는 작업이 필요해서 통신 횟수가 2회다.
//SEQUENCE 전략 사용
@Entity
@SequenceGenerator ( //시퀀스 생성기 등록
	name = "BOARD_SEQ_GENERATOR", // 시퀀스 생성기 이름
    sequenceName = "BOARD_SEQ", // DB의 시퀀스 이름
    initialValue = 1, //시작값
    allocationSize = 1 //증가하는 범위, 기본값 50
    //catalog //카탈로그명
    //schema //스키마명
)
public class Board {
	@Id
    @GeneratedValue(startegy = GenerationType.SEQUENCE,
    				generator = "BOARD_SEQ_GENERATOR") //시퀀스 생성기 사용
    private long Id;
}
  • TABLE : 키 생성 테이블을 사용
    • 기본키의 이름과 값 컬럼을 가진 키 생성 전용 테이블을 생성하여 사용
    • 테이블을 사용하여 모든 데이터베이스에서 사용할 수 있음
    • 테이블 전략 조회와 값을 증가시키기 위한 작업 때문에 통신 횟수가 1회 더 많다.
sequence_name == pkColumnName next_val == valueColumnName
BOARD_SEQ == pkColumnValue 2 == valueColumnValue
MEMBER_SEQ 10
PRODUCT_SEQ 50
//TABLE 전략 사용
@Entity
@SequenceGenerator ( //테이블 시퀀스 생성기 등록
	name = "BOARD_SEQ_GENERATOR", //테이블 시퀀스 생성기 이름
    sequenceName = "MY_SEQUENCE", //DB의 시퀀스 테이블 이름
    pkColumnValue = "BOARD_SEQ", //키로 사용할 값 이름
    allocationSize = 1 //증가하는 범위, 기본값 50
)
public class Board {
	@Id
    @GeneratedValue(startegy = GenerationType.TABLE,
    				generator = "BOARD_SEQ_GENERATOR") //테이블 시퀀스 생성기 사용
    private long Id;
}
  • AUTO : 선택한 데이터베이스에 따라 위의 3가지 전략 중 하나를 자동으로 선택
    • 오라클이면 SEQUENCE, MySQL이면 IDENTITY
    • 데이터베이스를 변경해도 코드를 수정하지 않아도 상관 없음
    • 키 생성 전략이 확정되지 않은 개발 초기 및 프로토타입 개발 시 유용
    • 스키마 자동 생성 기능을 사용하면 시퀀스나 키 생성용 테이블을 하이버네이트가 만들어 줌

기본키의 조건

  • null 허용하지 않음
  • 유일해야 함
  • 변하지 않아야 함

자연 키

비즈니스에 의미가 있는

사용자의 ID, 주민등록번호, 이메일 등

 

대리 키 (대체 키)

비스니스와 관련이 없는

오라클 시퀀스, auto_increment, 키 생성 테이블 등

 

비즈니스 규칙은 생각보다 쉽게 변하기 때문

자연 키는 기본키의 조건을 만족하지 않게될 수도 있어서

대리 키를 권장

@Column

@Column(name = "NAME", nullable = false, length = 10)
private String username;

컬럼을 매핑할 때 사용하는 어노테이션으로

옵션을 사용해 DDL을 생성할 수 있다.

속성

name

매핑할 컬럼명을 지정

기본값은 변수명을 따라감

nullable

null 값을 허용할지 지정

기본값은 true(허용)

length

문자의 최대 길이를 지정

insertable

해당 필드를 데이터베이스에 저장할지 지정

false면 데이터베이스에 저장하지 않으며 읽기 전용일 때 사용

기본값은 true

updatable

수정 내용을 데이터베이스에 반영할지 지정

insertable과 마찬가지로 읽기 전용일 때 사용

기본값은 true

table

하나의 엔티티를 두 개 이상의 테이블에 매핑할 때 사용

unique

하나의 컬럼에 유니크 제약조건을 걸 때 사용

두 개 이상의 컬럼에 유니크 제약조건을 걸려면

@Table 어노테이션의 uniqueConstraints 옵션을 사용

columnDefinition

데이터베이스의 컬럼 정보에 맞게 자동으로 설정

precision, scale

BigDecimal 타입에서 사용하며

각각 소수점 포함 전체 자릿수, 소수의 자릿수를 지정

double, float 타입에는 적용되지 않음

아주 큰 숫자나 정밀한 소수를 다루는 경우에만 사용

 

주의사항

@Column 어노테이션을 생략 시에

자바 기본 타입(int, char 등)은 null을 허용하지 않게 설정되고

객체 타입(Integer, String 등)은 null을 허용한다.

@Enumerated

enum RoleType {
	ADMIN, USER
}
@Enumerated(EnumType.STRING)
private RoleType roleType;

enum 타입을 매핑할 때 사용하는 어노테이션

속성

value

EnumType.ORDINAL : enum 순서를 데이터베이스에 저장  (기본값)

EnumType.STRING : enum 이름을 데이터베이스에 저장  (권장)

순서와 이름

위의 enum 클래스에는 순서대로 ADMIN, USER가 정의되어 있다.

 

ORDINAL 속성을 사용하면 각각 0, 1번이 되는데

데이터베이스에 저장되는 크기는 작지만,

이미 저장된 ENUM의 순서를 변경할 수 없다.

 

STRING 속성을 사용하면 각각의 이름을 그대로 사용한다.

저장된 ENUM의 순서가 바뀌거나 추가되어도 상관 없지만,

데이터베이스에 저장되는 크기가 크다.

@Temporal

@Temporal(Temporal.DATE)
private Date date;

@Temporal(Temporal.TIME)
private Date time;

@Temporal(Temporal.TIMESTAMP)
private Date timestamp;

Date, Calendar 같은 자바의 날짜 타입을 매핑할 때 사용하는 어노테이션

해당 어노테이션 생략 시 timestamp로 매핑한다.

속성

value(필수)

Temporal.DATE : 날짜를 데이터베이스의 date 타입과 매핑

Temporal.TIME : 시간을 데이터베이스의 time 타입과 매핑

Temporal.TIMESTAMP : 날짜와 시간을 데이터베이스의 timestamp 타입과 매핑

@Lob

@Lob
private String lobString //CLOB

@Lob
private byte[] lobByte //BLOB

문자열의 길이에 제한이 없는 경우 사용하는 BLOB, CLOB 타입으로 매핑할 때 사용하는 어노테이션

속성

지정할 수 있는 속성은 없지만

매핑하는 필드 타입에 따라 문자면 CLOB으로 매핑되고

나머지는 BLOB으로 매핑한다.

@Transient

@Transient
private Integer temp;

특정 필드를 매핑하지 않고 싶은 경우에 사용하는 어노테이션

 

데이터베이스에 저장되지도 않고 조회되지도 않으므로

객체에 임시로 데이터를 보관하고 싶을 때 사용

@Access

@Entity
@Access(AccessType.FIELD)
public class Member {
	@Id
	private String id;
}

@Entity
@Access(AccessType.PROPERTY)
public class Member {
	private String id;
    
    @Id
    public String getId() {
    	return id;
    }
}

JPA가 엔티티에 접근하는 방식을 지정할 때 사용하는 어노테이션

속성

AccessType

FIELD : 필드에 직접 접근하는 방식으로 접근 권한이 private이여도 가능

PROPERTY : 접근자(Getter)를 사용하여 접근하는 방식

 

기본키의 위치에 따라서 AccessType 속성을 적용한 것과 같기 때문에 생략해도 상관없다.

주의사항

nullable, length, uniqueConstraints rkxdms 속성은

DDL을 자동 생성할 때만 사용되고 JPA의 실행 로직에는 영향을 주지 않음

 

'Back-End > JPA' 카테고리의 다른 글

연관관계 매핑 기초  (0) 2023.06.20
엔티티 매핑 : 학습을 위한 스키마 자동 생성하기  (0) 2023.06.19
영속성과 엔티티  (0) 2023.06.01
JPA 시작하기  (0) 2023.06.01
엔티티 매핑 기본  (0) 2023.05.31

+ Recent posts