[JPA] 자바 ORM 표준 JPA 프로그래밍 ch.4

박지운·2023년 5월 11일
2

김영한님의 '자바 ORM 표준 JPA 프로그래밍'을 읽고 정리한 글입니다.


4장 엔티티 매핑

매핑 어노테이션 대표 4가지

  • 객체와 테이블 매핑 : @Entity, @Table
  • 기본 키 매핑 : @Id
  • 필드와 컬럼 매핑 : @Column
  • 연관관계 매핑 : @ManyToOne, @JoinColumn

4.1 @Entity

JPA이용해 테이블과 매핑할 클래스는 @Entity 필수 사용

주의사항

  • 기본 생성자는 필수

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

  • 저장할 필드에 final 사용 불가 : 상속을 불가
    final은 프록시 객체 생성 불가함 떄문에 final사용 불가함

    기본 생성자의 경우 생성자를 하나 이상 만들 경우 자바는 기본 생성자를 자동 생성하지 않는다.
    이때는 기본 생성자를 직접 만들어야 한다.

    public Member();

4.2 @Table

@Table은 엔티티와 매핑할 테이블을 지정한다.
생략하면 매핑한 엔티티 이름을 테이블 이름으로 사용한다.


4.3 다양한 매핑 사용

요구사항 추가

  1. 회원은 일반 회원과 관리자로 구분
  2. 회원 가입일가 수정일
  3. 회원 설명 필드 추가(길이 제한X)
package jpabook.start;
import javax.persistence *;

@Entity
@Table(name="MEMBER")
public class Member {
	
    @Id
    @Column(name = "ID")
    private String id;
    
    @Coumn(name = "NAME")
    private String username;
    
    private Integer age;
    
    /------추가------/
    @Enumerated(EnumType.String)
    private RoleType roleType;        - 1
	
    @Temporal(TemporalType.TIMESTAMP)
    private Date createdDate;;        - 2
    
    @Temporal(TemporalType.TIMESTAMP)
    private Date lastModifiedDate;    - 2
    
    @Lob
    private String description;       - 3
   	
    ...
}

package jpabook.start;

public enum RoleType {
	ADMIN, USER
}

1. roleType : @Enumerated 통해 enum 사용
2. createdDate, lastModifiedDate : 날짜 타입은 @Temporal사용
3. description : 길이 제한이 없으므로 VARCHAR 대신 CLOB 타입 사용, LOB통해 CLOB, BLOB사용 가능

BLOB : 이진대형객체(이미지,동영상)
CLOB : 문자대행객체(Character)

지금까지 테이블 먼저 생성 후 엔티티 생성.
데이터베이스 스키마 자동 생성을 사용하면 엔티티만 만들면 테이블은 자동 생성된다.


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

JPA는 매핑정보와 데이터베이스 방언을 사용, 스키마 생성
운영환경 X
생성된 DDL은 개발 장비에서만 사용
**create,update시 데이터가 사라질 수도 있다.


4.5 DDL 생성 기능

  • 회원 이름필수 추가, 10자 초과 제약조건
@Column(name="Name", nullable=false, length=10)
private String username;

생성된 DDL

create table MEMBER {
	ID varchar(255) not null,
    NAME varchar(10) not null,
    ...
    primary key(ID)
}
  • 유니크 제약조건
@Table(
    name="테이블 이름",
    
    uniqueConstraints={
        @UniqueConstraint(
             name = "unique 제약조건 이름",
             columnNames = {
                "포함할 컬럼이름 1",
                "포함할 컬럼이름 2"
            }
      ),
}
//columnName은 필드가 아닌 컬럼명과 일치해야한다.

profile
앞길막막 전과생

0개의 댓글