[ Intro ]
연관관계 매핑이 제일 복잡하고 생각해야할 것이 많다. 나머지는 무난무난
- 객체와 테이블 매핑 :
@Entity
/@Table
- 필드와 컬럼 매핑 :
@Column
/@Enumrated
/@Temporal
등- 기본 키 매핑 :
@Id
/@GeneratedValue
[ IDENTITY / SEQUENCE / TABLE 등 ]- 연관관계 매핑 :
@ManyToOne
/@JoinColumn
@Entity
@Entity
가 붙은 클래스는 JPA가 관리하며,엔티티
라고 함- 하나의 객체를 의미,
RDB
의Table
과 매핑됨- 기본적으로 객체 이름으로 매핑되는데 이름을 지정할 수 도 있음
@Entity(name = "Member") // @Entity 위와 동일! public class Member{ ... }
- 주의 할 점
- 기본 생성자 필수 (파라미터가 없는 생성자)
- final / enum / interface / inner 클래스 사용 X
@Table
- 엔티티와 매핑할 테이블 지정
- 기본적으로 객체 이름으로 매핑되는데 지정할 수도 있음
@Entity @Table(name = "MEMBERS") // MEMBERS로 직접 지정! public class Member{ ... }
- 유니크 제약조건 추가
/* 사실 필드 자체에 @unique로 지정할 수도 있지만, 제약조건의 이름을 지정할 수없어 나중에 확인하기 힘들고, 여러개 지정시 귀찮다 --> 이 방법이 선호됨 */ @Entity @Table(uniqueConstraints = { /* name과 age column을 유니크로 지정하고, 유니크 제약조건의 이름을 지정한 것! */ @UniqueConstraint( name ="NAME_AGE_UNIQUE",columnNames = {"NAME", "AGE"} ) }) public class Member{ ... }
[ 설명 & 사용 ]
- DDL을 애플리케이션 실행 시점에 자동 생성할 수 있음
- DB 방언을 활용해서 데이터베이스에 맞는 적절한 DDL을 생성해줌
hibernate.hbm2ddl.auto
속성 지정으로 사용(persistence.xml 파일에 hibernate 옵션을 추가)
/* 기존 테이블 삭제 후 다시 생성 (DROP + CREATE) */ <property name="hibernate.hbm2ddl.auto" value="create" /> /* create옵션과 같으나 종료시점에 DROP을 해준다 */ <property name="hibernate.hbm2ddl.auto" value="create-drop" /> /* 변경된 부분만 반영 --> 추가는 적용되나, 컬럼 삭제할 때에는 안됨 */ <property name="hibernate.hbm2ddl.auto" value="update" /> /* Entity와 Table이 정상 매핑되었는지만 확인 */ <property name="hibernate.hbm2ddl.auto" value="validate" /> /* 사실 none이라는 옵션은 없고 그냥 사용하지 않는다는 의미 --> 다른 값들어가도 됨 */ <property name="hibernate.hbm2ddl.auto" value="none" />
[ 주의 ]
- 운영하는 product 장비에서는 절대로
create
/create-drop
/update
사용 X
-->
create
는 table을 삭제할 수 있는 위험성이 있고,
update
는alter query
가 실행되면서table
이rock
걸리는 문제가 생길 위험
- 정리
- 개발 초기 단계 ->
create
/update
- 테스트 서버 단계 ->
validate
- 운영 서버 단계 ->
validate
ornone
[ 종류 ]
- 필드와 컬럼을 매핑할 때 사용되는 어노테이션의 종류
@Column
: 칼럼 매핑@Temporal
: 날짜 타입 매핑@Enumrated
: enum 매핑@Lob
: BLOB / CLOB 매핑@Transient
: 매핑 무시 (칼럼에 매핑하고 싶지 않을 때 사용!)
@Column
name
: 현재 필드와 매핑 될 테이블 column의 이름을 직접 지정
(default로 필드 명으로 매핑된다)insertable
/updateable
: 삽입 가능한지, 변경 가능한지에 대한 여부nullable
: null값의 허용여부를 결정 /(default)true
-> null 가능,false
-> null 불가능
(DB에서 column에 대한notnull
설정을 하는 것)unique
: 유니크 제약조건 여부
(제약조건의 이름을 설정할 수 없어서 잘 사용하지 않는 옵션)
@Temporal
- 날짜 타입을 매핑할 때 사용
- java의
Date
객체는 기본적으로 날짜, 시간을 모두 포함
그러나, DB에서는날짜
,시간
,날짜시간
3가지를 구분하기 때문에 그에 맞춰 우리도Date
객체를 구분해야 해서 이 어노테이션을 사용했었음.
@Temporal(TemporalType.TIMESTAMP) -> 날짜 + 시간 //@Temporal(TemporalType.DATE) -> 날짜 //@Temporal(TemporalType.TIME) -> 시간 private Date createdDate;
- 하지만 ! Java 8 부터는
LocalDate
/LocalDateTime
이 제공되면서 이제 이 어노테이션을 사용하지 않아도 된다.private LocalDateTime createdDate; // 날짜+시간 private LocalDateTime lastModifiedDate;
@Enumrated
- Enum 타입을 매핑할 때 사용
ORDINAL
/STRING
속성 이 있는데 무조건STRING
권장!
--> 숫자로 할 경우 enum의 순서가 수정되면 전부 바꿔야함;//@Enumerated(EnumType.ORDINAL) -> 숫자로 저장 @Enumerated(EnumType.STRING) -> 문자열로 저장 private RoleType roleType;
@Lob
@Transient
- DB 컬럼과 매핑을 원하지 않는 필드에 지정하는 어노테이션
- 주로 메모리상에서만 임시로 어떤 값을 보관할 때 사용
@Transient private Integer temp;