[JPA] Hibernate 엔티티(Entity) 매핑하기
by coco3o반응형
엔티티 매핑의 종류
> 객체와 테이블 매핑 : @Entity , @Table
> 기본 키 매핑 : @Id
> 필드와 컬럼 매핑 : @Column
> 연관관계 매핑 : @ManyToOne , @JoinColumn
@Entity
// name과 age Column에 unique 제약조건 추가
@Table(name="MEMBER", uniqueConstraints = {@UniqueConstraint(
name = "NAME_AGE_UNIQUE",
columnNames = {"NAME", "AGE"} )})
public class Member {
// 기본키 매핑
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
@Column(name = "ID")
private Long id;
// not null, varchar(10)
@Column(name = "NAME", nullable = false, length = 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
}
@Entity
- 테이블과의 매핑
- @Entity가 붙은 클래스는 JPA가 관리하는 것으로, 엔티티라고 불린다.
> 속성
- Name : JPA에서 사용할 엔티티 이름을 지정한다. (보통 default값인 클래스 이름을 사용)
> 주의사항
- 기본 생성자는 필수 (JPA가 엔티티 객체 생성 시 기본 생성자를 사용하기 때문)
- final 클래스, enum, interface, inner class 에는 사용할 수 없다.
- 저장할 필드에 final 사용 불가
@Table
- 엔티티와 매핑할 테이블을 지정
- 생략 시 매핑한 엔티티 이름을 테이블 이름으로 사용한다.
> 속성
- Name : 매핑할 테이블 이름 (default. 엔티티 이름 사용)
- CataLog : catalog 기능이 있는 DB에서 catalog 를 매핑 (default. DB 명)
- Schema : schema 기능이 있는 DB에서 schema를 매핑
- uniqueConstraints : DDL 생성 시 유니크 제약조건을 만듦 스키마 자동 생성 기능을 사용해서 DDL을 만들 때만 사용
데이터베이스 스키마 자동 생성
- JPA는 데이터베이스 스키마를 자동으로 생성하는 기능을 지원
- 클래스의 매핑 정보와 데이터베이스 방언을 사용하여 데이터베이스 스키마 생성
- 어플리케이션 실행 시점에 데이터베이스 테이블을 자동으로 생성
스키마 자동 생성 기능 사용을 위해 application.properties 에 속성 추가
spring.jpa.hibernate.ddl-auto=update
hibernate.ddl-auto 속성
- create : 기존 테이블을 삭제하고 새로 생성 (DROP + CREATE)
- create-drop : CREATE 속성에 추가로 어플리케이션을 종료할 때 생성한 DDL을 제거 (DROP + CREATE + DROP)
- update : DB 테이블과 엔티티 매핑 정보를 비교해서 변경 사항만 수정
- validate : DB 테이블과 엔티티 매핑정보를 비교해서 차이가 있으면 경고를 남기고 어플리케이션을 실행하지 않음
- none : 자동 생성 기능을 사용하지 않음
> 주의사항
- 개발 초기 단계는 create 또는 update
- 초기화 상태로 자동화된 테스트를 진행하는 개발자 환경과 CI서버는 create 또는 create-drop
- 테스트 서버는 update 또는 validate
- 스테이징과 운영 서버는 validate 또는 none
기본 키 매핑
- 영속성 컨텍스트는 엔티티를 식별자 값으로 구분하므로 엔티티를 영속 상태로 만들기 위해 식별자 값이 반드시 필요
@GeneratedValue 기본 키 생성 전략
- 직접 할당 : 기본 키를 어플리케이션에 직접 할당한다.
ㄴ em.persist()를 호출하기 전 어플리케이션에서 직접 식별자 값을 할당해야 함. 식별자 값이 없을 경우 오류 발생
- 자동 생성 : 대리 키 사용 방식이다.
- IDENTITY : 기본 키 생성을 데이터베이스에 위임 (= AUTO_INCREMENT)
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
@Column(name = "ID")
private Long id;
- SEQUENCE : 데이터베이스 시퀀스를 사용해서 기본 키를 할당한다.
- 식별자 값을 획득한 후 영속성 컨텍스트에 저장 유일한 값을 순서대로 생성 (오라클, PostgreSQL, DB2, H2)
- TABLE : 키 생성 테이블을 사용한다.
- 키 생성 전용 테이블 하나를 만들고 여기에 이름과 값으로 사용할 컬럼을 만들어 데이터베이스 시퀀스를 흉내내는 전략이다. 테이블을 사용하므로 모든 데이터베이스에 적용 가능
- AUTO : 선택한 데이터베이스 방언에 따라 방식을 자동으로 선택(default)
- Ex) 오라클 DB 선택 시 SEQUENCE , MySQL DB 선택 시 IDENTITY 사용
@Column
- 객체 필드를 테이블 컬럼에 매핑한다.
@Column(nullable = false)
private String data;
@Column(unique = true)
private String data;
@Column(columnDefinition = "varchar(100) default 'EMPTY'")
private String data;
@Column(length = 400)
private String data;
@Column(precision = 10, scale = 2)
private BigDecimal data;
> 속성
- 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) : BigDemical, BigInteger 타입에서 사용. 아주 큰 숫자나 정밀한 소수를 다룰 때 사용
@Enumerated
- 자바의 enum 타입을 매핑할 때 사용한다.
> 속성 :
- EnumType.ORIDINAL : enum에 정의된 순서대로 데이터베이스에 저장한다.
- EnumType.STRING : enum 이름 그대로 데이터베이스에 저장한다.
- (default. EnumType.ORIDINAL)
enum RoleType {
ADMIN, USER
}
@Enumerated
private RoleType roleType;
member.setRoleType(RoleType.ADMIN); // 1
@Enumerated(EnumType.STRING)
private RoleType roleType;
member.setRoleType(RoleType.ADMIN); // ADMIN
@Temporal
- 날짜 타입 (java.util.Date, java.util.Calendar)을 매핑할 때 사용한다.
@Temporal(TemporalType.DATE)
private Date date; // 날짜
@Temporal(TemporalType.TIME)
private Date date; // 시간
@Temporal(TemporalType.TIMESTAMP)
private Date date; // 날짜와 시간
> 속성
- TemporalType.DATE : 날짜, 데이터베이스 data 타입과 매핑 ( 2021-07-06 )
- TemporalType.TIME : 시간, 데이터베이스 time 타입과 매핑 ( 15:27:33 )
- TemporalType.TIMESTAMP : 날짜와 시간, 데이터베이스 timestamp 타입과 매핑 ( 2021-07-06 15:27:33 )
- ( default. TemporalType은 필수로 지정 )
@Temporal 을 생략하면 자바의 Date와 가장 유사한 timestamp로 정의한다.
@CreationTimestamp
private Timestamp createDate;
@UpdateTimestamp
private Timestamp updateDate;
- @CreationTimestamp : INSERT 시 현재시간을 저장
- @UpdateTimestamp : UPDATE 시 현재시간을 저장
@Lob
- 데이터베이스 BLOB, CLOB 타입과 매핑
> 속성
- 매핑하는 필드 타입이 문자면 CLOB을 매핑하고 나머지는 BLOB을 매핑한다.
- CLOB : String, char[]
- BLOB : byte[]
@Lob
private String lobString;
@Lob
private byte[] lobByte;
@Transient
- 필드에 매핑하지 않는다.
- 데이터베이스에 저장하지 않고 조회하지도 않는다.
- 객체에 임시로 어떤 값을 보관하고 싶을 때 사용한다.
@Transient
private Integer temp;
@Access
- JPA가 엔티티 데이터에 접근하는 방식을 지정한다.
- 필드 접근 : AccessType.FIELD 로 지정
- 필드에 직접 접근 (private도 접근 가능)
- 프로퍼티 접근 : AccessType.PROPERTY 로 지정
- 접근자 Getter를 사용한다.
반응형
'🌈Programming > JPA' 카테고리의 다른 글
[JPA] 즉시로딩과 지연로딩 알아보기(FetchType.EAGER, LAZY) (1) | 2022.01.15 |
---|---|
[JPA] 양방향 순환참조 문제 및 해결방법 (0) | 2022.01.05 |
[JPA] 연관관계 매핑 알아보기 (@ManyToOne, @OneToMany, @OneToOne, @ManyToMany) (1) | 2021.09.23 |
[JPA] querydsl 설정하기 (0) | 2021.08.05 |
[JPA] JPA와 Hibernate 그리고 Spring Data JPA (5) | 2021.07.05 |
블로그의 정보
슬기로운 개발생활
coco3o