본 글은 김영한님의 <자바 ORM 표준 JPA 프로그래밍>을 읽고 공부한 내용을 정리한 글입니다.
- @Entity
- @Table
- 데이터베이스 스키마 자동 생성
- DDL 생성 기능
- 기본 키 매핑
- 필드와 컬럼 매핑
name
속성을 설정하지 않으면 클래스 이름을 그대로 사용한다.name
속성을 설정하지 않으면 엔티티 이름을 그대로 사용한다.애플리케이션 실행 시점에 데이터베이스 테이블을 자동으로 생성한다.
<property name="hibernate.hbm2dd1.auto" value="create" />
hibernate.hbm2ddl.auto 속성
- create
: drop + create
- create-drop
: drop + create + drop
- update
: 변경 사항만 수정
- validate
: 변경 사항이 있으면 경고를 남기고 실행하지 않는다.
운영 서버에서 create, create-drop, update와 같이 DLL을 수정하는 옵션은 사용하지 말자.
이름 매핑 전략 변경
- 자바의 카멜 표기법 -> 데이터베이스의 언더스코어
- @Column.name 속성으로 직접 바꾸기
- 자동 매핑
persistence.xml 에 다음 속성 추가
<property name="hibernate.ejb.naming_strategy" value="org.hibernate.cfg.ImproveNamingStrategy" />
@Column(name = "NAME", nullable = false, length = 10)
private String name;
직접 할당 : 기본 키를 애플리케이션에서 직접 할당
자동 생성 : 대리 키 사용
- IDENTITY : 기본 키 생성을 데이터베이스에 위임
- SEQUENCE : 데이터베이스 시퀀스 이용
- TABLE : 키 생성 테이블 사용
em.persist()
로 엔티티를 저장하기 전에 애플리케이션에서 직접 할당해야 한다.Board board = new Board();
board.setId("1"); // id 직접 할당
em.persist(board);
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
private Long id;
em.persist()
를 호출하는 즉시 INSERT SQL이 DB에 전달된다.@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
<식별자 선택 전략>
1. null 값을 허용하지 않는다.
2. 유일해야 한다.
3. 변하지 않아야 한다.
객체 필드를 테이블 컬럼에 매핑한다.
@Column 생략
@Column 생략, 자바 기본 타입
int data1;
-> data1 integer not null
null 값을 입력할 수 없다.
@Column 생략, 객체 타입
Integer data2;
-> data2 integer
null 값을 입력할 수 있다.
@Column 사용, 자바 기본 타입
@Column int data3;
-> data3 integer
@Column은 nullable = true 가 기본값이므로 null 값을 입력할 수 있다.
따라서 nullable = false 로 지정해야 안전하다.
자바의 enum 타입을 매핑한다.
@Enumerated
의 속성
value
: 기본값은 ORDINALenum의 순서가 바뀌거나 추가되는 상황을 대비하여 EnumType.STRING을 사용할 것을 권장한다.
@Temporal
의 속성value
: TemporalType은 필수로 지정JPA가 엔티티에 접근하는 방식을 지정한다.
접근 방식
필드 접근
프로퍼티 접근
@Access를 설정하지 않으면 @Id의 위치를 기준으로 접근 방식을 설정한다.
@Id
private String id;
@Id
public String getId() {
return id;
}