[JPA] 필드와 컬럼 매핑

[JPA] 필드와 컬럼 매핑

필드와 컬럼 매핑

객체의 필드와 데이터베이스의 컬럼을 매핑하는 방법에 대해 알아보겠다.

1. @Column

객체필드를 테이블 컬럼에 매핑한다

주요 속성들

- name = String

-> 테이블 컬럼에 매핑될때의 이름을 정의한다.

- nullable = boolean

-> null값 허용 여부를 선택한다

- unique = boolean

-> 한 컬럼에 유니크 제약조건을 걸때 사용한다.

- length = int

-> String값에만 사용하며, 최대 길이를 설정한다.

예시

@Entity @Table(name = "USER") public class User extends CommonDate{ @Id @GeneratedValue @Column(name = "ID") private Long id; @Column(name = "USER_NAME", nullable = false, unique = true) private String userName; @Column(name = "CONTRIBUTION_COUNT", nullable = false) private long contributionCount; @Column(name = "RANK", nullable = false) private long rank; public User(){} }

2. @Enumerated

자바의 enum타입을 객체에 저장한다.

속성

- EnumType.STRING : enum 이름을 저장

- EnumType.ORDINAL : enum 순서를 저장

예시

@Enumerated(EnumType.STRING) private TestEnum testEnum;

3. @Temporal (Column을 사용한다)

자바의 java.util.Date나 java.util.Calendar을 저장할때 사용한다.

하지만, 자바의 java.util.Date api는 문제점이 많아서 사용을 지양해야하는데, 자세한 이유는 아래 링크를 보자.

https://d2.naver.com/helloworld/645609

따라서, 최근엔, java.time의 LocalDate와 LocalDateTime을 주로 사용하며, 컬럼 매핑또한 @Column으로 하는걸 지향하는 편이다.

@Column으로 필드를 매핑 해도 DB에는 date타입으로 저장된다.,

예시)

@MappedSuperclass public class CommonDate{ @Column(name = "LAST_MODIFIED_DATE") private LocalDate lastModifiedDate; public LocalDate getLastModifiedDate(){ return this.lastModifiedDate; } public void setLastModifiedDate(LocalDate lastModifiedDate){ this.lastModifiedDate = lastModifiedDate; } }

4. @Lob

데이터베이스 BLOB, CLOB타입과 매핑한다. CLOB과 BLOB은 각각은 매우 긴 문자열이나, 이미지, mp3등등 구조화되지않은 매우 큰 데이터를 저장한다.

(Lob에 저장할 수 있는 데이터 최대치는 컴퓨터 용량의 크기라고 한다.)

@Lob private String lobString; @Lob private byte[] lobByte;

5. @Transient

@Transient어노테이션이 있는 필드는 매핑하지 않는다.

@Transient private String transientString;

6. @Access

JPA가 Entity클래스 필드에 접근하는 방식을 지정한다.

속성

- AccessType.FIELD : 필드에 직접 접근한다. 필드 선언이 private이여도 접근 가능하다.

- AccessType.PROPERTY : getter와 setter를 이용해 접근한다.

@Access를 설정하지 않으면, @Id의 위치를 기준으로 접근 방식이 결정된다.

예시)

@Entity @Table(name = "ACCESS_CLASS") @Access(AccessType.PROPERTY) public class AccessClass{ /.../ @Id public String getId(){ return this.id; } @Column public String getDate(){ return this.date; } }

from http://dlwnsdud205.tistory.com/273 by ccl(A) rewrite - 2021-10-12 21:01:46