요구사항
- 회원은 일반회원과 관리자로 구분해야 한다.
- 회원 가입일과 수정일이 있어야 한다.
- 회원을 설명할 수 있는 필드가 있어야 한다. 이때 필드의 길이는 제한이 없다.
매핑 어노테이션 정리
1. @Column
- name : 필드와 매핑할 테이블의 컬럼 이름 ( default = 객체의 필드 이름 )
- insertable, updatable : 등록, 변경 가능 여부 ( default = true )
// 수정 불가능 하게 하고 싶을 때
@Column(name = "name", updatable = false)
private String username;
- nullable(DDL) : null 값의 허용 여부 , false 시 not null 제약조건 붙음
- unique(DDL)
: @Table 의 uniqueConstraints와 같지만 한 컬럼에 유니크 제약을 걸때 사용
: 컬럼에는 잘 사용 안함 → JPA가 unique 이름을 랜덤으로 생성해 복잡해짐
- columnDefinition(DDL) : 데이터베이스 컬럼 정보를 직접 줄 수 있다. ( default 설정 가능 )
@Column(name = "name", columnDefinition = "varchar(100) default 'EMPTY'")
private String username;
- length(DDL) : 문자 길이 제약조건, String 타입에서만 사용
- precision, scale(DDL) : BigDecimal(or BigInteger) 타입에서 사용한다.( 아주 큰 숫자나, 소수점 쓸때 )
2. @Enumerated
- 자바 enum 타입을 매핑 할 때 사용
- 기본값 = EnumType.ORDINAL
- EnumType.ORDINAL : enum 순서를 데이터베이스에 저장
- EnumType.STRING : enum 이름을 데이터베이스에 저장
// RoleType.java
public enum RoleType{
USER, ADMIN
}
// Member.java
@Enumerated(EnumType.ORDINAL)
private RoleType roleType;
// Main.java
Member member = new Member();
member.setId(101L);
member.setUsername("JPA");
member.setRoleType(RoleType.ADMIN);
em.persist(member);
★ Enumerated는 필수로 EnumType.STRING을 사용해야함
why? 만약 RoleType에서 GUEST를 맨 앞에 추가 한다면 원래 0번 순서가 USER인데 GUEST 로 바뀜!
( DB가 꼬이기 때문에 STRING으로 사용해야 한다. )
3. @Temporal
- 날짜 타입( java.util. Date, java.util.Calendar ) 매핑 할 때 사용
- 요즘은 잘 안쓰인다.
TemporalType.DATE | 날짜, 데이터베이스 date 타입과 매핑( 년월일 ) |
TemporalType.TIME | 시간, 데이터베이스 time 타입과 매핑( 시분초 ) |
TemporalType.TIMESTAMP | 날짜와 시간, 데이터베이스 timestamp 타입과 매핑( 년월일 시분초 ) |
@Temporal(TemporalType.TIMESTAMP)
private Date createdDate;
BUT, 요즘은 LocalDate(최신 하이버네이트 지원) 사용으로 많이들 생략해서 사용한다.
// date 타입과 일치
private LocalDate testLocalDate;
// timestamp 타입과 일치
private LocalDateTime testLocalDateTime;
4. @Lob
- Lob 에는 지정할 수 있는 속성이 없다.
- 매핑하는 필드 타입이 문자면 clob 매핑, 나머지는 blob 매핑
- clob : String, char[], java.sql.CLOB
- blob: byte[], java.sql.BLOB
5. @Transient
- 필드가 매핑이 되지 않는다.
- 데이터베이스에 저장 X, 조회 X
- 주로 메모리 상에서만 임시로 어떤 값을 보관하고 싶을 때 사용
// @Transient : DB 컬럼과 관계 없이 메모리 에서만 사용 하고 싶을 때 사용
@Transient
private int temp;
요구사항 바탕으로 작성된 엔티티
package hellojpa;
import javax.persistence.*;
import java.util.Date;
@Entity
public class Member {
// pk 매핑
@Id
private Long id;
// DB 컬럼명은 name을 하고싶고 객체 이름은 다른 걸 하고싶을때
@Column(name = "name")
private String username;
private Integer age;
@Enumerated(EnumType.STRING)
private RoleType roleType;
// @Temporal은 타입이 세가지 존재 DATE(날짜), TIME(시간), TIMESTAMP(날짜+시간)
@Temporal(TemporalType.TIMESTAMP)
private Date createdDate;
@Temporal(TemporalType.TIMESTAMP)
private Date lastModifiedDate;
// varchar를 넘어서는 큰 콘텐츠를 사용 하고 싶을때 Lob 사용
@Lob
private String description;
// @Transient : DB 컬럼과 관계 없이 메모리 에서만 사용 하고 싶을 때 사용
@Transient
private int temp;
// 기본생성자
public Member(){
}
}
'JAVA' 카테고리의 다른 글
[JAVA] JPA 연관관계 매핑( 단방향 ) (0) | 2021.11.16 |
---|---|
[JAVA] JPA 기본키 매핑 (0) | 2021.11.11 |
[JAVA] JPA 엔티티 매핑 + DB 스키마 자동생성 (0) | 2021.11.10 |
[JAVA] JPA 준영속 상태 (0) | 2021.11.09 |
[JAVA] JPA 플러시(flush) (0) | 2021.11.09 |