web/JPA

JPA 매핑 어노테이션 - DDL

반응형

JPA 매핑에 사용되는 어노테이션은 크게 유형에 따라 4가지로 나누어진다.

유형
어노테이션
객체와 테이블 매핑
@Entity, @Table
기본 키 매핑
@Id
필드와 컬럼 매핑
@Column
연관관계 매핑
@ManyToOne, @JoinColumn


@Entity

JPA를 사용해서 테이블과 매핑할 클래스에는 무조건 붙혀야하는 어노테이션이다. 속성으로 name을 지정할 수 있다. 안할 시 기본 클래스 이름으로 한다.

1
@Entity(name = "Member")
cs


- 기본 생성자가 필수로 있어야 한다. 
- final 클래스와 private 생성자는 할 수 없다.


@Table

엔티티와 매핑할 테이블을 지정한다. 생략하면 매핑하는 엔티티이름으로 대신한다.
-name, catalog, schema, uniqueConstraints(DDL 선언시 유니크 제약조건) 등을 같이 설정하여 만들 수 있다.

이렇게 설정된 클래스를 가지고 자동으로 테이블을 생성할 수 있다.

1
spring.jpa.hibernate.ddl-auto=update
cs

설정하는 값에 따라서 테이블 생성이 달라지는데 create는 기존 테이블을 삭제하고 새로 생성하고, create-drop는 애플리케이션이 종료될때 제거되고 update는 변경된 사항만 수정하고 validate는 매핑정보가 달라졌을때 경고를 주면서 애플리케이션 실행을 하지 않고 none는 아무런 동작을 하지 않는다.


DDL 생성 시 설정

@Colummn 매핑에는 nullable 속성과 length등의 속성을 지정할 수 있다

1
2
3
4
@Column(name = "NAME", length = 10, nullable = false)
private String userName;
 
// NAME varchar(10) not null 과 매핑
cs


@Table 어노테이션은 UniqueConstraint를 지정할 수 있다.

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
/**
 * springboottest
 *
 * @author wedul
 * @since 03/10/2018
 **/
@Entity(name = "Member")
@Data
@Table(name = "MEMBER", uniqueConstraints = {@UniqueConstraint(
        name = "NAME_AGE_UNIQUE", columnNames = {"NAME""AGE"}
)})
public class Member {
 
  @Id
  @Column(name = "ID")
  private String id;
 
  @Column(name = "NAME", length = 10, nullable = true)
  private String userName;
 
  // 매핑 정보가 없는 필드
  private int age;
 
}
 
// ALTER TABLE MEMBER ADD CONSTRAINT NAME_AGE_UNIQUE UNIQUE(NAME, AGE); 로 매핑
cs


기본키는 @Id를 사용하여 지정할 수 있고 AUTO_INCREMENT와 같은 기능을 @GeneratedValue를 사용하여 지정할 수 있다.

1
2
3
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private long orderId;
cs


추가적인 속성으로 IDENTITY(기본키 생성을 데이터베이스가 함), SEQUENCE(데이터베이스 시퀀스를 사용해서 기본 키 할당), TABLE (키 생성 테이블 생성)이 있다. 각 속성이 모든 데이터베이스 업체에 적용되는건 아니고 적용되는 벤더만 사용된다. 만약 이 모든 설정을 하는게 번거롭다면 그냥 @GeneratedValue 어노테이션만 사용하면 된다. 왜냐하면 기본 설정이 GenerationType.AUTO인데 이는 벤더에 맞게 전략이 선택되어 사용된다.


레퍼런스 : 자바 ORM 표준 JPA 프로그래밍

반응형