- 객체와 테이블 매핑 :
@Entity
,@Table
- 필드와 컬럼 매핑 :
@Column
- 기본 키 매핑 :
@Id
- 연관관계 매핑 :
@ManyToOne
,@JoinColumn
@Entity
가 붙은 클래스는 JPA가 관리하며, 엔티티
라고한다.@Entity
필수!\📌 주의
기본 생성자
필수(파라미터가 없는 public 또는 protected 생성자)- final 클래스, enum, interface, inner 클래스에 사용 불가
- 저장할 필드에
final 사용 불가
엔티티 이름
을 지정한다.클래스 이름
을 그대로 사용가급적 기본값
을 사용한다.@Table
은 엔티티와 매핑할 테이블
을 지정한다.속성 | 기능 | 기본값 |
---|---|---|
name | 매핑할 테이블 명 | 엔티티 이름을 사용 |
catalog | 데이터베이스 catalog 매핑 | |
schema | 데이터베이스 schema 매핑 | |
uniqueConstraints(DDL) | DDL 생성시 유니크 제약 조건 생성 |
@Entity
@Table(name = "Members") //DB의 Members테이블과 매핑
public class Member{
@Id
private Long id;
private String name;
}
- DDL을 애플리케이션
실행 시점에 자동 생성
- 테이블 중심 ->
객체 중심
- 데이터베이스 방언을 활용해서
데이터베이스에 맞는 적절한 DDL
생성- 이렇게 생성된 DDL은
개발 장비에서만
사용- 생성된 DDL은 운영서버에서는 사용하지 않거나, 적절히 다듬은 후 사용
옵션 | 속성 |
---|---|
create | 기존 테이블 삭제 후 다시 생성 (DROP + CREATE) |
create-drop | create와 같으나 종료시점에 테이블 DROP |
update | 변경된 내역만 반영(운영 DB에는 사용하면 안됨) |
validate | 엔티티와 테이블이 정상 매핑되었는지만 확인 |
none | 사용하지 않음 |
<persistence-unit name="hello">
<properties>
<!-- 필수 속성 -->
...
<!-- 옵션 -->
<property name="hibernate.show_sql" value="true"/>
<property name="hibernate.format_sql" value="true"/>
<!--DB방언 설정-->
<property name="hibernate.use_sql_comments" value="true"/>
<!--데이터베이스 스키마 자동생성 속성-->
<property name="hibernate.hbm2ddl.auto" value="create" />
</properties>
</persistence-unit>
create
또는 update
update
또는 validate
validate
또는 none
- 필드와 컬럼 매핑 어노테이션을 알아보자
어노테이션 | 설명 |
---|---|
@Column | 컬럼 매핑 |
@Temporal | 날짜 타입 매핑 |
@Enumerated | enum 타입 매핑 |
@Lob | BLOB, CLOB 매핑 |
@Transient | 특정 필드를 컬럼에 매핑하지 않음(매핑 무시) |
- 필드와 매핑할
테이블의 컬럼명
설정- 기본 값은 객체의
필드명
이다.//DB의 컬럼명이 user_name인 컬럼과 매핑 @Colum(name ="user_name") private String name;
- 컬럼을 등록 또는 수정 했을 때 DB에 변경 할지 여부 설정
- 기본 값은
TRUE
//등록은 OK. 변경은 하면 안될때 @Colum(updatable = false) private String name;
- 컬럼의
null
값 허용 여부 설정- 기본 값은
TRUE
//not null로 설정 @Colum(nullable = false) private String name;
- 컬럼에 간단한
유니크 제약 조건
을 건다@Table
의uniqueConstraints
와 같지만,uniqueConstraints
는 유니크 제약조건의 이름 설정이 가능하므로 잘 사용하지 않는다.//유니크 제약조건 설정 @Colum(unique = true) private String name;
- 유니크 제약조건 명이 랜덤으로 들어간다.
@Entity //@Table의 uniqueConstraints를 사용하면 유니크 제약조건 이름을 설정할 수 있다. @Table(uniqueConstraints="Member_nuiqe") public class Member{ ... }
- 데이터베이스의
컬럼 정보
를 직접 설정//컬럼 타입은 varchar(100), 디폴트값은 'EMPTY' @Colum(columnDefinition="varchar(100) default 'EMPTY') private String name;
문자 길이
제약 조건String
타입에만 사용 가능- 기본 값은
255
//컬럼타입 길이를 10으로 변경 - varchar(10) @Colum(lenght = 10) private String name;
아주 큰 숫자
나정밀한 소수
를 다루어야 할 때만 사용percision
은 소수점을 포함한 전체 자릿수를,scale
은 소수의 자릿수를 의미BigDecimal
타입에서 사용
- 자바
enum 타입
을 매핑할 때 사용- 기본 값은
EnumType.ORDINAL
EnumType.ORDINAL
:enum 순서
를 데이터베이스에 저장EnumType.STRING
:enum 이름
을 데이터베이스에 저장@Enumerated(EnumType.STRING) private int age;
📌 주의! ORDINAL는 사용 하면 안된다!
- ORDINAL는 enum의 순서(0,1...)로 enum을 저장한다.
- 이미 만들어둔 enum의 순서가 바뀌거나, 변경(추가,삭제)가 된다면?
➡️엄청나게 큰일이 벌어진다...
- 날짜 타입(
java.util.Date
,java,util,Calendar
)을 매핑할 때 사용LocalDate
,LocalDateTime
을 사용할 때는생략 가능
(최신 하이버 네이트 지원)//날짜. 데이터베이스 date 타입과 매핑(예 : 2013-10-11) @Temporal(TemporalType.DATE) private Date date1; //시간. 데이터베이스 time 타입과 매핑(예 : 11:11:11) @Temporal(TemporalType.TIME) private Date date2; //날짜와 시간. 데이터베이스 timestamp타입과 매핑(예 : 2013-10-11 11:11:11) @Temporal(TemporalType.TIMESPAMP) private Date date3;
- 데이터베이스
BLOB
,CLOB
타입과 매핑- 매핑하는 필드 타입이 문자면
CLOB
매핑, 나머지는BLOB
매핑@LOB private String text;
- 특정 필드를
컬럼에 매핑하지 않을 때
사용- 필드 매핑 X, 데이터베이스에 저장X, 조회X
- 주로 메모리상에서만 임시로 어던 값을 보관하고 싶을 때 사용
@Transient private Integer temp;
기본 키 매핑에 대해 알아보자
- @Id 어노테이션을 사용하면 기본키 직접 할당이 된다.
@Id
private Long id;
IDENTITY
: 데이터베이스에 위임. MYSQLSEQUENCE
: 데이터베이스 시퀀스 오브젝트 사용. ORACLE@SequenceGenerator
필요TABLE
: 키 생성용 테이블 사용. 모든 DB에서 사용 가능@TableGenerator
필요AUTO
: 방언에 따라 자동 지정. 기본 값@Id @GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
데이터베이스 시퀀스
: 유일한 값을 순서대로 생성하는 특별한 데이터 베이스 오브젝트@SequenceGenerator
필요@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;
}
키 생성 전용 테이블
을 하나 만들어서 데이터베이스 시퀀스를 흉내내는 전략@TableGenerator
필요장점
: 모든 데이터베이스에 적용 가능단점
: 성능기본 키 제약 조건
: null 아님, 유일, 변하면 안된다대리키(대체키)
를 사용하자!