필드와 컬럼 매핑
package hellojpa;
import javax.persistence.*;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.Date;
@Entity
public class Member {
@Id
private Long id;
@Column(name = "name") //컬럼명 설정 가능
private String username;
private Integer age;
@Enumerated(EnumType.STRING) //Enum type 설정 가능
private RoleType roleType;
@Temporal(TemporalType.TIMESTAMP) //날짜 type, 그리고 여기에는 type이 3개존재 Date, time, timestamp
private Date createdDate;
@Temporal(TemporalType.TIMESTAMP)
private Date lastModifiedDate;
@Lob //varchar를 넘는 큰 요소
private String description;
}
매핑 어노테이션 정리
- @Column : 컬럼 매핑
- @Temporal : 날짜 타입 매핑
- @Enumerated : enum 타입 매핑
- @Lob : BLOB, CLOB 매핑
- @Transient : 특정 필드를 컬럼에 매핑하지 않음(매핑 무시), 메모리에서만 쓰겠다.
1. @Column
속성 | 설명 | 기본값 |
name | 필드와 매핑할 테이블의 칼럼 이름 | 객체의 필드 이름 |
insertable, updatable | 등록, 변경 가능 여부, inset나 update할 때 이 요소를 무시할건지 무시안할건지 | TRUE |
nullable(DDL) | null 값의 혀용 여부를 설정한다. false로 설정하면 DDL 생성 시에 not null 제약조건이 붙는다. | |
unique(DDL) | @Table의 uniqueConstraints와 같지만 한 컬럼에 간단히 유니크 제 약조건을 걸 때 사용한다. 하지만 이름이 이상하게 나와 잘 사용하지 않는다. | |
columnDefinition(DDL) | 데이터베이스 컬럼 정보를 직접 줄 수 있다. ex) varchar(100) default ‘EMPTY' |
필드의 자바 타입과 방언 정보를 사용해 |
length(DDL) | 문자 길이 제약조건, String 타입에만 사용한다. | 255 |
precision, scale(DDL) | BigDecimal 타입에서 사용한다(BigInteger도 사용할 수 있다). precision은 소수점을 포함한 전체 자 릿수를, scale은 소수의 자릿수 다. 참고로 double, float 타입에는 적용되지 않는다. 아주 큰 숫자나 정 밀한 소수를 다루어야 할 때만 사용한다. |
precision=19, scale=2 |
2. @Enumerated
자바의 enum 타입을 매핑할 때 사용한다.
속성은 value
- EnumType.ORDINAL: enum 순서를 데이터베이스에 저장 (디폴트 값)
- EnumType.STRING: enum 이름을 데이터베이스에 저장
EnumType.ORDINAL은 사용하지 않는다. 서비스 도중 enum이 하나 추가해 순서가 변하 되면 지금까지 데이터베이스에 저장된 내용들은 바뀌지 않으므로 심각한 오류가 생긴다.
3.@Temporal
날짜 타입(java.util.Date, java.util.Calendar)을 매핑할 때 사용한다.
LocalDate, LocalDateTime을 사용할 때는 생략 가능(최신 하이버네이트 지원) 이걸로 요즘 사용을 많이 한다고 한다.
속성은 value
- TemporalType.DATE: 날짜, 데이터베이스 date 타입과 매핑 (예: 2013–10–11)
- TemporalType.TIME: 시간, 데이터베이스 time 타입과 매핑 (예: 11:11:11)
- TemporalType.TIMESTAMP: 날짜와 시간, 데이터베이 스 timestamp 타입과 매핑 (예: 2013–10–11 11:11:11)
4.@Lob
데이터베이스 BLOB, CLOB 타입과 매핑, @Lob에는 지정할 수 있는 속성이 없다.
매핑하는 필드 타입이 문자면 CLOB 매핑, 나머지는 BLOB 매핑
- CLOB: String, char[], java.sql.CLOB
- BLOB: byte[], java.sql. BLOB
5.@Transient
필드에 매핑이 필요하지 않을 때 사용한다. 데이터베이스에 저장하지 않고 따라서 조회 할 수도 없다.
주로 메모리상에서만 임시로 어떤 값을 보관하고 싶을 때 사용한다.
기본 키 매핑
기본 키 매핑 방법에는 직접 할당(@Id만 사용), 자동 생성(@GeneratedValue)이 있다. 직접 할당은 그냥 내가 할당 하고 싶은 것에 할당하는 것이다.
자동 생성(@GeneratedValue)
1. IDENTITY 전략 - 특징
@Entity
public class Member {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
- 기본 키 생성을 데이터베이스에 위임
- 주로 MySQL, PostgreSQL, SQL Server, DB2에서 사용 (예: MySQL의 AUTO_ INCREMENT)
저번 시간에 배운대로라면 JPA는 보통 트랜잭션 커밋 시점에 INSERT SQL 실행을 하게 된다. 하지만 AUTO_ INCREMENT는 데이터베이스에 INSERT SQL을 실행 한 이후에 ID 값을 알 수 있게 된다. 그래서 IDENTITY 전략은 em.persist() 시점에 즉시 INSERT SQL 실행 하고 DB에서 식별자를 조회하게 된다. 그래야 auto_increment를 정상적으로 실행 할 수 있다.
2.SEQUENCE 전략 - 특징
@Entity
@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;
데이터베이스 시퀀스는 유일한 값을 순서대로 생성하는 특별한 데이터베이스 오브젝트(예: 오라클 시퀀스)
오라클, PostgreSQL, DB2, H2 데이터베이스에서 사용
속성 | 설명 | 기본값 |
name | 식별자 생성기 이름 | 필수 |
sequenceName | 데이터베이스에 등록되어 있는 시퀀스 이름 | hibernate_sequence |
initialValue | DDL 생성 시에만 사용됨, 시퀀스 DDL을 생성할 때 처음 1 시작하는 수를 지정한다. | 1 |
allocationSize | 시퀀스 한 번 호출에 증가하는 수 성능 최적화에 사용됨 데이터베이스 시퀀스 값이 하나씩 증가하도록 설정되어 있으면 이 값 을 반드시 1로 설정해야 한다 |
50 |
catalog, schema | 데이터베이스 catalog, schema 이름 |
//initialValue = 1, allocationSize = 50이라고 할당 된 경우
//제일 처음 next value for MEMBER_SEQ가 2번 호출 처음에는 1 그리고 51
//51까지 할당 후 메모리에서 하나씩 올림
em.persist(member1); //1, 51
em.persist(member2); //메모리에서 호출 -> 2
em.persist(member3); //메모리에서 호출 -> 3
//51을 만나는 순간 next call을 한 번더 호출해 100까지 세팅
3.TABLE 전략
@Entity
@TableGenerator(
name = "MEMBER_SEQ_GENERATOR",
table = "MY_SEQUENCES",
pkColumnValue = "MEMBER_SEQ", allocationSize = 1)
//MY_SEQUENCES라는 테이블이 만들어진다.
public class Member {
@Id
@GeneratedValue(strategy = GenerationType.TABLE,
generator = "MEMBER_SEQ_GENERATOR")
private Long id;
키 생성 전용 테이블을 하나 만들어서 데이터베이스 시퀀스를 흉 내내는 전략이다.
장점은 모든 데이터베이스에 적용 가능 하지만 단점은 성능 문제가 있다.
create table MY_SEQUENCES (
sequence_name varchar(255) not null,
next_val bigint,
primary key ( sequence_name )
)
실행결과 위의 테이블이 만들어져 다음 번호를 저장하고 있는다.
권장하는 식별자 전략
기본 키 제약 조건은 null이 아니고 유일하며 변하면 안된다. 미래까지 이 조건을 만족하는 자연키를 찾는 것응 매우 어렵다. 그래서 우리는 대리키를 사용한다.
강사님이 권장하는 대리키는 Long형 + 대체키 + 키 생성전략 사용이다.
강의 출처 : https://www.inflearn.com/course/ORM-JPA-Basic
자바 ORM 표준 JPA 프로그래밍 - 기본편 - 인프런 | 강의
JPA를 처음 접하거나, 실무에서 JPA를 사용하지만 기본 이론이 부족하신 분들이 JPA의 기본 이론을 탄탄하게 학습해서 초보자도 실무에서 자신있게 JPA를 사용할 수 있습니다., - 강의 소개 | 인프런
www.inflearn.com
'BackEnd > 자바 ORM 표준 JPA 프로그래밍' 카테고리의 다른 글
JPA 단방향 연관관계 (0) | 2022.12.23 |
---|---|
JPA 실전 예제 1 - 요구사항 분석과 기본 매핑 (0) | 2022.12.23 |
JPA 엔티티 매핑(객체와 테이블 매핑) (0) | 2022.12.22 |
JPA 영속성 관리 - 내부 동작 방식 (0) | 2022.12.22 |
JPA 시작 (1) | 2022.12.22 |