본문 바로가기
JPA Basic

JPA Basic - 3

by 완두완두콩 2021. 11. 18.

객체와 테이블 매핑


@Entity : JPA 가 관리하는 클래스를 뜻한다.

주의할 점으로는

1. 기본 생성자 필수(파라미터 없는 public 또는 protected 생성자)

2. final, enum , interface , inner 클래스 사용 불가

3. 저장할 필드에 fianl 사용 불가

 

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

 

 

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


@Entity 가 붙어있으면 알아서 테이블을 Create 해서 생성해준다.

persistence.xml 파일의 hibernate 설정을 다음과 같이 바꿔줄 수도 있다.

필드와 컬럼 매핑


 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
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…
}
cs

 

@Column(name ="name") : 객체의 이름은 username 이라고 사용, DB에는 name 으로 이름을 설정. (컬럼명 = name)

@Enumerated : Enum 타입을 사용하고 싶은 경우 사용.

@Temporal : 날짜, 시간 타입을 지정하고 싶을 때.

@Enumerated : enum 타입 매핑

 

@Column


 

- insertable , updatable -> false 로 설정 시 , DB에 접근 불가능

- nullabale -> false 로 설정 시 , not null 제약 조건이 걸린다.

- unique -> 유니크 제약조건을 만들어준다. // 이름이 랜덤하게 설정 ( 반영하기 힘들다) -> Class 에 제약조건 거는 방법 선호 . 추후에 설명

- columnDefinition -> 데이터베이스 컬럼 정보를 그대로 적용시킨다.

- precision , scale =-> 아주 큰 수, 소수 사용할 때 사용.

 

 

@Enumerated 


 

* EnumType.ORDINAL : 순서에 따라 값이 0, 1 등으로 저장.

-> 절대 사용 금지.  // EnumType.STRING 으로 설정해서 사용한다. -> 이름 저장.

 

 

@Temporal


날짜 타입을 매핑할 때 사용.

*자바 8로 넘어간 이후 부터는 @Temporal 을 사용하지 않고 LocalDate, LocalDateTime 을 사용한다.

private LocalDate testLocalDate;

년 / 월 만 포함 -> DB에 date 형태로 생성

private LocalDateTime testLocalDateTime;

년 / 월 / 일 모두 포함 -> DB에 timeStamp 형태로 생성

 

 

@Lob


@Lob 은 Large Object 의 줄임말로 , 더 많은 길이의 문자열 등을 저장할 수 있다.

이를 이용해서 사진을 저장하는 칼럼 같은 용도로 사용할 수 있다.

 

 

 

기본 키 매핑


@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private String id;

IDENTITY : MYSQL 의 AUTO_INCREMENT 수행.

직접 설정이 불가능하고 자동으로 설정. 아이디 값을 알기 위해서는 DB에 들어간 뒤에나 확인이 가능하다.

이전의 영속성 관리에서 다뤘듯이 , 캐시에 값을 할당 후 QUERY 문을 COMMIT 시점에 DB로 전달하였으나 IDENTITY 는 바로 INSERT 문을 쿼리로 작성해서 보내준다.

-> em.persist 시점에 바로 QUERY 가 호출된다. -> ID 값을 바로 확인 가능하다.

 

 

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;

SEQUENCE : 유일한 값을 순서대로 생성. 오라클 , H2 DB 등에서 사용. String 사용 불가

allocationSize 설정을 통해 em.persist("member1) em.persist("member2) em.persist("member3)  3번의 쿼리문을 날려도

계속 네트워크를 타고 넘어가는 것이 아닌 , 50까지의 값을 모아놓고 그 안에서 1 , 2 , 3 으로 점점 증가시켜나간다.

DB SEQ = 1 / DB SEQ = 51       -> allocationSIze를 50으로 설정해놨으므로 51까지 호출해놓는다.

1 | 51 -> 2 | 51 -> 3 | 51      -> 처음을 제외한 값은 모두 메모리에서 호출된다.

( 51까지. 51이 넘어가면 다시 101 로 증가시키기 위한 쿼리문 생성)

 

식별자 전략


Auto_INCREMENT 또는 SEQUENCE 사용.

비즈니스를 KEY 로 가져오는 것 방지.

 

* 해당 글은 'Infleran'의 김영한 강사님의 자료를 참조하였습니다.

'JPA Basic' 카테고리의 다른 글

JPA Basic - 6  (0) 2021.12.30
JPA Basic - 5  (0) 2021.12.29
JPA Basic - 4  (0) 2021.12.28
JPA Basic - 2  (0) 2021.11.16
JPA Basic - 1  (0) 2021.11.16

댓글