티스토리 뷰

반응형


| 엔티티와 매핑



객체와 테이블 매핑 : @Entity, @Table

기본 키 매핑 : @Id

필드와 컬럼 매핑 : @Column

연관관계 매핑 : @ManyToOne, @JoinColumn


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
@Entity
// name과 age Column에 unique 제약조건 추가
@Table(name="MEMBER", uniqueConstraints = {@UniqueConstraint(
        name = "NAME_AGE_UNIQUE",
        columnNames = {"NAME""AGE"} )})
public class Member {
 
    // 기본키 매핑
    @Id
    @Column(name = "ID")
    private String id;
 
    // not null, varchar(10)
    @Column(name = "NAME", nullable = falselength = 10)
    private String username;
 
    private Integer age;
 
    // Java의 enum 사용
    @Enumerated(EnumType.STRING)
    private RoleType roleType;
 
    // Java의 날짜 타입
    @Temporal(TemporalType.TIMESTAMP)
    private Date createdDate;
 
    @Temporal(TemporalType.TIMESTAMP)
    private Date lastModifiedDate;
 
    // CLOB, BLOC 타입 매핑
    @Lob
    private String description;
 
    @Transient
    private String temp;
 
 
    //Getter, Setter
}
 
public enum RoleType {
    ADMIN, USER
}
cs


|| @Entity



- 테이블과의 매핑

- @Entity가 붙은 클래스는 JPA가 관리하는 것으로, 엔티티라고 불림

> 속성

Name : JPA에서 사용할 엔티티 이름을 지정.

       보통 기본값인 클래스 이름을 사용


> 주의사항

- 기본 생성자는 필수 (JPA가 엔티티 객체 생성 시 기본 생성자를 사용)

- final 클래스, enum, interface, inner class 에는 사용할 수 없음

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



|| @Table



- 엔티티와 매핑할 테이블을 지정

- 생략 시 매핑한 엔티티 일므을 테이블 이름으로 사용


> 속성 

Name : 매핑할 테이블 이름 (default. 엔티티 이름 사용)

Catalog : catalog 기능이 있는 DB에서 catalog 를 매핑 (default. DB 명)

Schema : schema 기능이 있는 DB에서 schema를 매핑

uniqueConstraints : DDL 생성 시 유니크 제약조건을 만듦

     스키마 자동 생성 기능을 사용해서 DDL을 만들 때만 사용



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



- JPA는 데이터베이스 스키마를 자동으로 생성하는 기능을 지원

- 클래스의 매핑 정보와 데이터베이스 방언을 사용하여 데이터베이스 스키마 생성 

애플리케이션 실행 시점에 데이터베이스 테이블을 자동으로 생성


- 스키마 자동 생성 기능 사용을 위해 persistence.xml에 속성 추가

1
<property name="hibernate.hbm2ddl.auto" value="create" />
cs


hibernate.hbm2ddl.auto 속성

create : 기존 테이블을 삭제하고 새로 생성(DROP + CREATE)

create-drop : CREATE 속성에 추가로 애플리케이션을 종료할 때 생성한 DDL을 제거 (DROP + CREATE + DROP)

update : DB 테이블과 엔티티 매핑 정보를 비교해서 변경 사항만 수정

validate : DB 테이블과 엔티티 매핑정보를 비교해서 차이가 있으면 경고를 남기고 애플리케이션을 실행하지 않음.

DDL을 수행하지 않음

none : 자동 생성 기능을 사용하지 않음


> 주의사항

- 개발 초기 단계는 create 또는 update

- 초기화 상태로 자동화된 테스트를 진행하는 개발자 환경과 CI서버는 create 또는 create-drop

- 테스트 서버는 update 또는 validate

- 스테이징과 운영 서버는 validate 또는 none


+


** 테이블 명이나 컬럼 명이 생략되면 자바의 카멜 표기법을 테이블의 언더스코어 표기법으로 매핑하는 방법

Before.

1
2
@Column(name="role_type")
private RoleType roleType;
cs


After.

persistence.xml에 속성 추가

1
<property name="hibernate.ejb.naming_strategy" value="org.hibernate.cfg.ImprovedNamingStrategy" />
cs



|| 기본 키 매핑



- 영속성 컨텍스트는 엔티티를 식별자 값으로 구분하므로 엔티티를 영속 상태로 만들기 위해 식별자 값이 반드시 필요


@GeneratedValue

<기본 키 생성 전략>

- 직접 할당 : 기본 키를 애플리케이션에 직접 할당

ㄴ em.persist()를 호출하기 전 애플리케이션에서 직접 식별자 값을 할당해야 함. 식별자 값이 없을 경우 예러 발생


- 자동 생성 : 대리 키 사용 방식

* IDENTITY : 기본 키 생성을 데이터베이스에 위임 (= AUTO_INCREMENT)

1
2
3
4
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
@Column(name = "ID")
private Long id;
cs

- Statement.getGeneratedKeys() 를 사용해서 데이터를 저장함과 동시에 생성된 기본 키 값을 얻어 올 수 있음.


* SEQUENCE : 데이터베이스 시퀀스를 사용해서 기본 키를 할당, 

   데이터베이스 시퀀스에서 식별자 값을 획득한 후 영속성 컨텍스트에 저장

   유일한 값을 순서대로 생성(오라클, PostgreSQL, DB2, H2)


* TABLE : 키 생성 테이블을 사용

키 생성 전용 테이블 하나를 만들고 여기에 이름과 값으로 사용할 컬럼을 만들어

데이터베이스 시퀀스를 흉내내는 전략. 테이블을 사용하므로 모든 데이터베이스에 적용 가능


AUTO : 선택한 데이터베이스 방언에 따라 방식을 자동으로 선택(Default)

  Ex) 오라클 DB 선택 시 SEQUENCE, MySQL DB 선택 시 IDENTITY 사용


** 키 생성 전략 사용 시 persistence.xml 에 아래 속성 추가

1
<property name="hibernate.id.new_generator_mappings" value="true" />
cs



|| @Column



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

속성 중 name, nullable이 주로 사용되고 나머지는 잘 사용되지 않음


1
2
3
4
5
6
7
8
9
10
11
12
13
14
@Column(nullable = false)
private Strin data;
 
@Column(unique = true)
private Strin data;
 
@Column(columnDefinition = "varchar(100) default 'EMPTY'")
private Strin data;
 
@Column(length = 400)
private Strin data;
 
@Column(precision = 10, scale = 2)
private BigDecimal data;
cs


> 속성

name : 필드와 매핑할 테이블 컬럼 이름 (default. 객체의 필드 이름)

nullable (DDL) : null 값의 허용 여부 설정, false 설정 시 not null (default. true)

   @Column 사용 시 nullable = false 로 설정하는 것이 안전

unique (DDL) : @Table 의 uniqueConstraints와 같지만 한 컬럼에 간단히 유니크 제약조건을 적용

columnDefinition (DDL) : 데이터베이스 컬럼 정보를 직접 줄 수 있음, default 값 설정

   (default. 필드의 자바 타입과 방언 정보를 사용해 적절한 컬럼 타입을 생성)

length (DDL) : 문자 길이 제약조건, String 타입에만 사용 (default. 255)

percision, scale (DDL) : BigDecimal, BigInteger 타입에서 사용. 아주 큰 숫자나 정밀한 소수를 다룰 때만 사용

(default. precision = 19, scale = 2)



|| @Enumerated



자바의 enum 타입을 매핑할 때 사용


> 속성

value : EnumType.ORDINAL : enum 순서를 데이터베이스에 저장

 EnumType.STRING : enum 이름을 데이터베이스에 저장

 (default. EnumType.ORDINAL)



|| @Temporal



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


1
2
3
4
5
6
7
8
@Temporal(TemporalType.DATE)
private Date date; // 날짜
 
@Temporal(TemporalType.TIME)
private Date date; // 시간
 
@Temporal(TemporalType.TIMESTAMP)
private Date date; // 날짜와 시간
cs


> 속성

value : TemporalType.DATE : 날짜, 데이터베이스 data 타입과 매핑 (2020-12-18)

 TemporalType.TIME : 시간, 데이터베이스 time 타입과 매핑 (23:36:33)

 TemporalType.TIMESTAMP : 날짜와 시간, 데이터베이스 timestamp 타입과 매핑 (2020-12-18 23:36:33)

 (default. TemporalType은 필수로 지정)


@Temporal 을 생략하면 자바의 Date와 가장 유사한 timestamp로 정의



|| @Lob



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


> 속성

지정 속성이 없음

대신 매핑하는 필드 타입이 문자면 CLOB로 나머지는 BLOB로 매핑



|| @Transient



이 필드는 매핑하지 않음

데이터베이스에 저장하지 않고 조회하지도 않음

객체에 임시로 어떤 값을 보관하고 싶을 때 사용



|| @Access



JPA가 엔티티 데이터에 접근하는 방식을 지정


- 필드 접근 : AccessType.FIELD 로 지정

  필드에 직접 접근 (private도 접근 가능)

- 프로퍼티 접근: AccessType.PROPERTY 로 지정

 접근자 Getter를 사용





출처 : 자바 ORM 표준 JPA 프로그래밍

반응형
댓글
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday