Free Lines Arrow
본문 바로가기
DataBase/JPA

[JPA] 엔티티, 테이블, 컬럼 매핑

by skahn1215 2021. 7. 30.
728x90
반응형

엔티티 맵핑 소개

  • @Entity, @Table: 객체와 테이블을 맵핑할때 사용한다.
  • @Column: 필드와 컬럼매핑
  • @Id: 기본 키 매핑
  • @ManyToOne, @JoinColumn: 연관관계 매핑

 

 

 

 

객체와 테이블 맵핑

 

사용법 및 주의점

  • @Entity: 해당 어노테이션이 붙은 클래는 JPA가 관리, 엔티티 라고한다.
    - JPA 를 사용해서 테이블과 매핑할 클래스는 @Entity가 필수다.
  • 기본생성자는 필수로 작성해줘야 한다.
  • final 클래스 enum, interface, inner 클래스 사용 하면 안된다.
  • 저장할 필드에 final 사용 하지 않는다.

 

 

@Entity 어노테이션

  • name  속성을 가지고 있다.
    - JPA에서 사용할 엔티티 이름을 지정한다
    - 기본값은 class 이름을 그대로 사용한다.
    - 같은 클래스 이름이 있을때 써준다.
    - 보통은 잘 사용하지 않는다.

// 꼭넣어야 한다.
// JPA가 로딩 될때 해당 어노테이션을 보고 인식한다.
@Entity
public class Member {

    private Long id;
    private String name;

    //JPA 는 기본생성자가 있어야 한다.
    public Member() {
    }
}

 

 

 

 

@Table 어노테이션

  • name 속성
    - 저장될 테이블 명을 사용자가 지정할수 있다.
    - 기본 값은 엔티티 이름을 사용한다.
  • 아래처럼 @Table(name = "USER") USER로 해주면 
    저장될때 테이블명이 USER 로된다.
// 꼭넣어야 한다.
// JPA가 로딩 될때 해당 어노테이션을 보고 인식한다.
@Entity
@Table(name = "USER") // 테이블명 지정
public class Member {

    private Long id;
    private String name;

    //JPA 는 기본생성자가 있어야 한다.
    public Member() {
    }
}

 

  • catalog
    데이터베이스 catalog 매핑
  • schema 
    데이터베이스 schema 매핑
  • uniqueConstraints(DDL)
    DDL 생성시 유니크 제약 조건 생성

 

 

 

필드와 컬럼 맵핑

 

@Column 어노테이션

 

속성

  • name: 필드와 매핑할 컬럼이름을 직접 지정 할 수 있다.

  • insertable, updatable: 데이터 변경시 DB에 반영할지 말지 여부를 정할수 있다.

  • nullable: null 값의 혀용 여부를 설정한다
    - false 일 경우 DDL 생성시 not null 제약 조건이 붙는다.

  • unique: @Table의 uniqueConstraints와 같지만 한 컬럼에 유니크 제약조건을 걸 때 사용한다.

  • columnDefinition: 데이터 베이스 컬럼 정보를 직접 줄 수 있다.

  • length: 문자길이 제약조건, String 타입에만 사용된다.

  • percesion, scale: BigDecimal 타입에서 사용한다.
    - precision은 소수점을 포함한 전체 자 릿수를 scale은 소수의 자릿수를 지정한다.
package hellojpa.columnmapping;

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

// 꼭넣어야 한다.
// JPA가 로딩 될때 해당 어노테이션을 보고 인식한다.
@Entity
public class ColumnMember {

    // 컬럼이름을 지정해준다.
    // insertable: 컬럼을 수정시 DB 인서트 할것인지
    // updateable: 수정시 업데이트 할 것인지 안할 것인지
    // 둘다 false 로 하면 DB에 변경 내용이 들어 가지 않는다.
    // nullable: false일 경우 not null 제약 조건이 적용된다.
    // unique: 제약 조건을 만들어 준다. 하지만 여기서걸면 이름이 맘대로 생성
    // 그래서 @Table 에서 걸어준다.
    @Column(name = "name", nullable = false, length = 100)
    private String name;

}

 

 

 

 

@Enumerated

자바의 enum  타입을 매핑할때 사용한다.
참고로 DB에는 enum 타입이 없기 때문에 해당 매핑이 필요하다.

 

 

속성

  • EnumType.ORDINAL: enum 순서를 DB에 저장, 0 ,1 ,2 3 
  • EnumType.STRING: enum 이름을 데이터베이스에 저장

 

주의점

  • Enumerated 를 사용할 경우 ORDINAL은 사용하면 안된다.
  • 순서가 바뀌거나 새로운 타입이 추가 됐을경우 문제가 심각하다.
package hellojpa.columnmapping;

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

// 꼭넣어야 한다.
// JPA가 로딩 될때 해당 어노테이션을 보고 인식한다.
@Entity
//@Table(name = "USER") // 테이블명 지정
public class ColumnMember {

    //DB 에는 enum 타입이 없기 때문에  Enumerated로 맵핑해준다.
    // EnumType은 무조건 String으로 한다.
    @Enumerated(EnumType.STRING)
    private RoleType roleType;

}

 

 

 

 

@Temporal

날짜 타임 을 매핑할때 사용된다.

 

속성

  • TemproalType.DATE: 날짜, DB 의 date 타입과 매핑
  • TemproalType.TIME: 시간 데이터베이스 time 타입과 매핑
  • TemporalType.TIMESTAMP: 날짜, 기간 데이터 베이스 timestamp 타입과 매핑

참고

LocalDate, LocalDateTime을 사용할 떄는 생략 가능하다.

 

package hellojpa.columnmapping;

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

// 꼭넣어야 한다.
// JPA가 로딩 될때 해당 어노테이션을 보고 인식한다.
@Entity
//@Table(name = "USER") // 테이블명 지정
public class ColumnMember {

    @Temporal(TemporalType.TIMESTAMP)
    private Date lastModifiedDate;

    private LocalDate testLocalDate;
    private LocalDateTime testLocalDataTime;

}

 

 

 

 

@Lob

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

 

속성

  • @Lob에는 지정할 수 있는 속성이 없다.
    매핑하는 필드 타임이 문자면 CLOB, 나머지는 BLOB 매핑이된다.
  • CLOB: String, charp[], java.sql.CLOB
  • BLOB: byte[], java.sql.BLOB

 

 

 

@Transient

필드매핑을 안할때 사용한다.

데이터 베이스에 해당필드는 저장 되지 않고 조회 할수 없다.

메모리상에서만 임시로 사용할때 지정

@Transient
private Integer temp;

 

 

 

 

 

요구사항

1. 회원은 일반, 관리자로 나뉜다.

2. 회원 가입일과 수정일이 있다.

3. 회원을 설명하는 필드가 있다. 길이 제한이 없다.

 

 

ColumnMember

package hellojpa.columnmapping;

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

// 꼭넣어야 한다.
// JPA가 로딩 될때 해당 어노테이션을 보고 인식한다.
@Entity
//@Table(name = "USER") // 테이블명 지정
public class ColumnMember {

    @Id //PK 설정
    private Long id;


    // 컬럼이름을 지정해준다.
    // insertable: 컬럼을 수정시 DB 인서트 할것인지
    // updateable: 수정시 업데이트 할 것인지 안할 것인지
    // 둘다 false 로 하면 DB에 변경 내용이 들어 가지 않는다.
    // nullable: false일 경우 not null 제약 조건이 적용된다.
    // unique: 제약 조건을 만들어 준다. 하지만 여기서걸면 이름이 맘대로 생성
    // 그래서 @Table 에서 걸어준다.
    @Column(name = "name", nullable = false, length = 100)
    private String name;

    private Integer age;

    //DB 에는 enum 타입이 없기 때문에  Enumerated로 맵핑해준다.
    // EnumType은 무조건 String으로 한다.
    @Enumerated(EnumType.STRING)
    private RoleType roleType;

    // DB 에는 Date, Time, Data+time 이 있기 때문에 맵핑으로 지정해준다.
    // 날짜타입에 쓰는건데 지금은 필요없다.
    // 그냥 LocalDate 를 쓰면된다.
    @Temporal(TemporalType.TIMESTAMP)
    private Date createdDate;
    
    @Temporal(TemporalType.TIMESTAMP)
    private Date lastModifiedDate;

    private LocalDate testLocalDate;
    private LocalDateTime testLocalDataTime;

    // VACHAR 보다 큰 경우 사용한다.
    @Lob
    private String description;

    //JPA 는 기본생성자가 있어야 한다.
    public ColumnMember() {
    }
}

 

 

 

 

참고

https://www.inflearn.com/course/ORM-JPA-Basic/lecture/21695?tab=curriculum&speed=1 

 

자바 ORM 표준 JPA 프로그래밍 - 기본편 - 인프런 | 학습 페이지

지식을 나누면 반드시 나에게 돌아옵니다. 인프런을 통해 나의 지식에 가치를 부여하세요....

www.inflearn.com

 

728x90
반응형

'DataBase > JPA' 카테고리의 다른 글

[JPA] 기본키 맵핑  (0) 2021.07.31
[JPA] 데이터베이스 스키마 자동 생성  (0) 2021.07.30
[JPA] 준영속성  (0) 2021.07.30
[JPA] 플러시  (0) 2021.07.30
[JPA] 영속성 컨텍스트  (0) 2021.07.30

댓글