
객체와 테이블을 매핑한다
@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
DDLDDL : Data definition languageDB를 정의하는 명령어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)
@Enumeratedenum 이름을 DB에 저장
EnumType.STRING을 사용하자!(
EnumType.ORDINAL사용 X)
@Temporal날짜 타입(Date, Calendar 유틸) 매핑
LocalDate,LocalDateTime을 사용할 때는 생략 가능
@LobDB BLOB(문자X), CLOB(문자) 타입과 매핑
@Transient해당 필드는 매핑X
@ManyToOne, @JoinColumn연관관계를 매핑 한다
1대1, m대n 등@Access
JPA가엔티티에 접근하는 방식을 지정
PK) 매핑@Id직접 할당
@GeneratedValue자동 생성
AUTO: DB 방언에 따라 자동 지정(기본값)IDENTITY: DB에 위임,MYSQLSEQUENCE: DB 시퀀스 오브젝트 사용,ORACLETABLE: 키 생성용 테이블 사용, 모든 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 프로그래밍(김영한)