JAVA

[JAVA] JPA 필드와 컬럼 매핑

응디 2021. 11. 10. 16:49

요구사항

  1. 회원은 일반회원과 관리자로 구분해야 한다.
  2. 회원 가입일과 수정일이 있어야 한다.
  3. 회원을 설명할 수 있는 필드가 있어야 한다. 이때 필드의 길이는 제한이 없다.

매핑 어노테이션 정리

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);

ORDINAL 로 설정 시 ROLETYPE이 INT(순서로) 들어가는 예시
STRING으로 설정 시 이름으로 들어가는 예시

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

clob 붙는 예시

 


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