본문 바로가기
Backend, Server/JPA

[JPA] 엔티티 매핑 기본

by ggyongi 2021. 12. 9.
반응형

객체와 테이블 매핑

@Entity

- @Entity가 붙은 클래스는 JPA가 관리하게 됨

- JPA를 사용하여 테이블과 매핑할 클래스는 필수다.

- 주의할 점은 클래스는 기본 생성자를 반드시 가지고 있어야 한다.

- final 클래스, enum, interface, inner 클래스에는 사용 불가

- 저장할 필드에 final 사용 불가

 

@Table

- @Table은 엔티티와 매핑할 테이블을 지정한다.

- @Table(name = "xxx")와 같은 방식으로 엔티티 이름을 설정해줄 수 있다.

 

 

데이터베이스 스키마 자동 생성

hibernate.hbm2ddl.auto

create : 기존 테이블 삭제 후 다시 생성

create-drop : create와 같으나 종료시점에 테이블을 drop함

update : 변경분만 반영

validate : 엔티티와 테이블이 정상 매핑되었는지 확인

none : 사용하지 않음

* 운영 장비에는 절대로 create, create-drop, update를 사용하면 안된다. 큰 사고가 날 수 있다...!

 

 

매핑 어노테이션 정리

package hellojpa; 
import javax.persistence.*; 
import java.time.LocalDate; 
import java.time.LocalDateTime; 
import java.util.Date;

@Entity 
public class Member { 

   @Id 
   private Long id; 
   
   @Column(name = "name") 
   private String username; 
   
   private Integer age; 
   
   @Enumerated(EnumType.STRING) 
   private RoleType roleType; 
   
   @Temporal(TemporalType.TIMESTAMP) 
   private Date createdDate; 
   
   @Temporal(TemporalType.TIMESTAMP) 
   private Date lastModifiedDate; 
   
   @Lob 
   private String description; 
   
   //Getter, Setter…
}

@Column : 컬럼 매핑
@Temporal : 날짜 타입 매핑
@Enumerated : enum 타입 매핑
@Lob : BLOB, CLOB 매핑
@Transient : 특정 필드를 컬럼에 매핑하지 않음(매핑 무시)

 

 

@Column 속성

@Enumerated

ORDINAL : enum 순서에 따라 0,1,2, 형태로 저장하기 때문에 enum에 값이 추가되면 순서가 뒤엉킬 수 있음. 따라서 STRING 속성을 사용하는 것이 좋다.

@Temporal

날짜 타입(java.util.Date, java.util.Calendar)을 매핑할 때 사용

참고: LocalDate, LocalDateTime을 사용할 때는 생략 가능(최신 하이버네이트 지원)

@Lob

데이터베이스 BLOB, CLOB 타입과 매핑

• @Lob에는 지정할 수 있는 속성이 없다.

• 매핑하는 필드 타입이 문자면 CLOB 매핑, 나머지는 BLOB 매핑

• CLOB: String, char[], java.sql.CLOB

• BLOB: byte[], java.sql. BLOB

 

 

기본 키 매핑

직접 할당: @Id

자동생성: @GeneratedValue

 - IDENTITY : 데이터베이스에 위임, MYSQL

 - SEQUENCE : 시퀀스 오브젝트 사용, ORACLE, @SequenceGenerator 필요

 - TABLE : 키 생성용 테이블 사용, 모든 DB에서 사용, @TableGenerator 필요

 - AUTO : 방언에 따라 자동 지정, 기본값

 

 

* IDENTITY 전략

- 기본 키 생성을 데이터베이스에 위임

- 주로 MySQL, PostgreSQL, SQL Server, DB2에서 사용 (예: MySQL의 AUTO_ INCREMENT)

영속 컨텍스트에서는 1차 캐시에 데이터를 넣는 다고 했었는데 이를 위해선 pk값이 있어야함. 그런데 auto_increment 모드에서는 pk값이 db에 insert 되는 시점에 생기기 때문에 1차 캐시로 저장할 수가 없게 됨. 이를 위해 IDENTITY 전략에서는 persist 하는 시점에 예외적으로 바로 db에 넣어서 pk값을 받는다. 그리고 내부적으로 select 쿼리를 날리지 않아도 그 값을 반환받아 가져옴.

 

 

* SEQUENCE 전략 - @SequenceGenerator 필요

주의: allocationSize 기본값 = 50

 

* TABLE 전략 - @TableGenerator 필요

 

------------------------------------------------------------------------------

*레퍼런스 : 인프런 김영한님 강의(자바 ORM 표준 JPA 프로그래밍)

 

비전공자 네카라 신입 취업 노하우

시행착오 끝에 얻어낸 취업 노하우가 모두 담긴 전자책!

kmong.com

댓글