객체와 테이블을 매핑한다
@Entity
JPA
를 통해 테이블과 매핑할 클래스는@Entity
가 필수
- 기본 생성자 필수
- 생성자를 따로 만드므로 기본생성자를 따로 만들어줘야 함
final
,enum
,interface
,inner class
사용불가- 필드에
final
금지(바뀔 값 이니까)name
속성 :JPA
에서 쓸엔티티
이름 지정(기본값 클래스 이름을 되도록 쓰자)
@Table
엔티티
와 매핑할 테이블 지정
name
속성 : 매핑할 이름 지정(기본값 엔티티 이름)
유니크 제약조건
추가@Table(uniqueConstraints = {
@UniqueConstraint(
name = "NAME_AGE_UNIQUE",
columnNames = {"NAME", "AGE"}
)
}
)
DDL
을 애플리케이션 실행 시점에 자동 생성
hibernate.hbm2ddl.auto=CREATE
DDL
DDL
: Data definition language
DB
를 정의하는 명령어CREATE
, DROP
, ALTER
, TRUNCATE
등DDL
자동생성 기능
DB
중심 -> 객체 중심
데이터베이스
방언을 활용JPA
실행 로직에 영향 X개발 장비
에서만 사용
- 운영서버에서 사용하지 말자!(
validate
나none
사용)
create
: 기존테이블 삭제 후 재생성(기존 테스트코드에서 쓰던 방식, DROP
+ CREATE
)create-drop
: 종료 시점에 테이블 drop
(DROP
+ CREATE
+ DROP
)update
: 변경된 부분만 반영(운영 DB
사용 X : 테이블에 락 걸림)validate
: 엔티티
와 테이블의 정상 매핑여부만 확인(DDL
수정 X)none
: 사용안함
운영장비
에서는create
,update
쓰지마라!!!
- 개발 초기에는
create
/update
- 테스트 서버에서는
update
/validate
(여기서도 가급적 쓰지 마라)- 운영서버는
validate
/none
import java.beans.Transient;
@Entity
public class Member {
@Id
private Long id;
@Column(name = "name") // 해당 이름으로 칼럼 매핑
private String username;
private Integer age; // 생각한대로 매핑됨
@Enumerated(EnumType.STRING) // enum 타입 지정
private RoleType roleType;
@Temporal(TemporalType.TIMESTAMP) //날짜 매핑(TIMESTAMP : 날짜+시간)
private Date createdDate;
@Lob // 큰 컨텐츠(BLOB, CLOB 등)
private String description;
@Transient // 매핑에 사용 X
private int temp;
}
@Id
기본 키(PK)를 매핑한다
@Column
필드와 컬럼을 매핑한다
name
: 필드와 매핑할 테이블의 컬럼 이름자바
카멜표기법
→ DB
언더스코어
//해당 속성 추가를 통해 자동 변환 가능
<property name="hibernate.ejb.naming_strategy" value="org.hibernate.cfg.ImprovedNamingStrategy" />
insertable
: 등록가능 여부 지정updatable
: 변경가능 여부 지정nullable
: null 값 허용 여부 설정unique
: 유니크 제약조건 걸 때 사용(잘 안씀) -> @Table
에서 검columnDefinition
: DB 칼럼정보를 직접 줌length
: 문자 길이 제약조건precision
, scale
: BigDecimal
(큰 숫자, 소수점 등) 타입에서 사용@Column(nullable = false, length = 10)
@Enumerated
enum
이름을 DB
에 저장
EnumType.STRING
을 사용하자!(
EnumType.ORDINAL
사용 X)
@Temporal
날짜 타입(Date
, Calendar
유틸) 매핑
LocalDate
,LocalDateTime
을 사용할 때는 생략 가능
@Lob
DB
BLOB
(문자X), CLOB
(문자) 타입과 매핑
@Transient
해당 필드는 매핑X
@ManyToOne
, @JoinColumn
연관관계를 매핑 한다
1대1
, m대n
등@Access
JPA
가엔티티
에 접근하는 방식을 지정
PK
) 매핑@Id
직접 할당
@GeneratedValue
자동 생성
AUTO
: DB 방언에 따라 자동 지정(기본값)IDENTITY
: DB에 위임,MYSQL
SEQUENCE
: DB 시퀀스 오브젝트 사용,ORACLE
TABLE
: 키 생성용 테이블 사용, 모든 DB에서 사용, 성능저하 우려 있고 잘 안쓴다
IDENTITY
전략기본 키 생성을
데이터베이스
에 위임
class Member {
@GeneratedValue(strategy = GenerationType.IDENTITY)
public Integer id;
}
MySQL
의 AUTO_INCREMENT
등에서 사용
AUTO_ INCREMENT
DB
에 INSERT SQL
을 실행한 이후에 ID
값을 알 수 있음SELECT
문 없이, ID
값이 객체에 자동 매핑
됨방식
SEQUENCE
전략class Member {
@GeneratedValue(strategy = GenerationType.SEQUENCE)
@SequenceGenerator(
name = "MEMBER_SEQ_GENERATOR",
sequenceName = "MEMBER_SEQ", // 매핑할 데이터베이스 시퀀스 이름
initialValue = 1,
allocationSize = 50
)
public Integer id;
}
allocationSize
: 한번에 50개(기본값)의 인덱스 가져옴(테이블
전략에서도 사용되는 방식)
방식
DB 시퀸스
를 통해 id
조회id
를 엔티티
에 할당엔티티
를 영속성 컨텍스트
에 저장트랜잭션 커밋
후, 엔티티
를 DB
에 저장TABLE
전략방식
키 생성 전용 테이블
을 하나 만든다 이름
과 값
으로 사용할 컬럼을 만든다
Long
형태
대체키
사용
IDENTITY
키 생성 전략(auto-increment
)
PK
제약조건 : null
아님, 유일, 불변
자연키
를 찾기 힘들다대리키
(대체키)를 쓰자[책, 강의]
자바 ORM 표준 JPA 프로그래밍
(김영한
)