JPA

DDL 자동 생성 및 엔티티 매핑

유휴 2022. 11. 27. 20:45

강의참고 - 자바 ORM 표준 JPA 프로그래밍 - 기본편

 

자바 ORM 표준 JPA 프로그래밍 - 기본편 - 인프런 | 강의

JPA를 처음 접하거나, 실무에서 JPA를 사용하지만 기본 이론이 부족하신 분들이 JPA의 기본 이론을 탄탄하게 학습해서 초보자도 실무에서 자신있게 JPA를 사용할 수 있습니다., - 강의 소개 | 인프런

www.inflearn.com

 

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

- 데이터베이스에 맞는 DDL을 엔티티 매핑에 따라 애플리케이션 실행시점에 자동생성한다.

- persistance.xml 에 hibernate.hbm2ddl.auto 설정 추가

    * create : 기존 테이블 삭제 후 다시 생성

    * create-drop : 테이블 생성 후 종료시점에 drop

    * update : 추가되는 사항에 대한 변경분만 반영

    * validate : 엔티티와 테이블이 정상매핑 되었는지 확인

    * none : 사용하지 않음

@ Column (DDL 생성시에 제약조건을 지정 가능하다.)
    * unique = true :  unique 제약조건을 설정한다. constraint name 임의생성하므로 => @Table의 uniqueConstraint를 사용
    * nullable = false : notnull 제약조건 추가
    * length = 10 : 문자길이 제약조건
    * columnDefinition : 데이터베이스 컬럼 정보를 직접 적용 ex) varchar(100) default 'Empty'
    * percision, scale // BigDecimal, 정밀 소수점 매핑

 

엔티티 매핑

1. 객체와 Table 간의 매핑

2. 필드와 Column 매핑

3. 기본키 매핑

4. 연관관계 매핑

 

1. 객체와 Table 간의 매핑

@Entity (기본생성자 필수[public, protected],  final 키워드 사용 X)
    -
name : JPA에서 사용할 엔티티명 지정 (기본값 :  클래스의 이름을 그대로 사용)
@Table
    - name :  매핑할 테이블 지정 (기본값 :  엔티티의 이름을 그대로 사용)
    - catalog : 데이터베이스 catelog 매핑
    - schema : 데이터베이스 schema 매핑
    - uniqueConstraints : DDL 생성 시 유니크 제약 조건 추가

 

2.필드와 Column 매핑

@Id // 기본키 매핑
@GeneratedValue // 기본키 자동 생성
private Long id;

@Column(name="name", insertable=true, updatable=true)  // 필드username과 컬럼name을 매핑
private String username;

private Integer age; // db에도 number타입으로 저장됨

@Enumerated(EnumType.String) // (STRING, ORDINAL) 두가지 타입으로 구분하며, 각각 값, 순서 저장
private RoleType roleType; // db에는 enumType이 없으므로, 어노테이션에서 지정한 타입적용

@Lob // Clob, Blob 매핑시에 사용
private String description;

@Transient // 특정 필드를 컬럼과 매핑하지 않을 때 사용하는 어노테이션
private int temp;

 // java8부터 LocalDate, LocalDateTime 으로 구분하여 사용안함
@Temporal(TemporalType.TIMESTAMP) // (TIMESTAMP, DATE, TIME) 세가지 타입으로 구분
private Date createdDate

 

3.기본키 매핑

@Id // 기본키 매핑
@GeneratedValue // 기본키 자동 생성
private Long id;
1. 직접할당 하는경우 @Id만 사용
2. 자동으로 생성하는경우  @GeneratedValue 같이사용하며 3가지 strategy사용
    - GengerationType.IDENTITY : 데이터베이스에 위임(autoIncrement)
        * 테이블에 데이터가 들어가야 pk를 알 수 있으므로 persist시에 insert쿼리 flush

    - GengerationType.SEQUENCE : 데이터베이스 시퀀스사용
        * persist시에 nextVal을 시퀀스에서 읽어와서, commit시에 insert
        * 기본값으로 hibernate의 기본 시퀀스를 사용하거나 Entity 클래스에 @SequneceGenerator선언
           또는 @GeneratedValue의 속성에 generator = name 선언하여 직접 지정 할 수 있다.

    - GengerationType.TABLE : 키 생성 전용 테이블을 생성
        * 모든 데이터베이스에 적용 가능하는 장점이 있으나, 성능 저하
        * Entity 클래스에 @TableGenerator 선언 혹은 @GeneratedValue의 속성에 generator = name 선언하여 테이블 지정

3. @GenratedValue를 sequence혹은 table 지정 시 사용방법
    - @SequneceGenerator(name, sequenceName, initialValue, allocationSize, catalog, schema)
    - @TableGenerator(name, table, pkColumnValue, allocationSize, catalog, schema)
    - name : 엔티티 필드 @GenratedValue 의 generator 속성에 정의해줄 식별자명
    - sequneceName / table : 데이터베이스에 등록되어있는 시퀀스명, (테이블 전략의 경우 테이블명)
    - initialValue / pkColumnValue : 시퀀스 DDL 생성시 동작하는 어노테이션, 처음 시작하는 수를 지정
    - allocationSize : 시퀀스 nextVal 시에 증가시켜줄 값 최적화용도로 지정한 사이즈만큼의 시퀀스를 한번에 가져옴
    - catalog, schema : 데이터베이스의 catalog, schema의 이름

 

4.연관관계 매핑

- @ManyToOne

- @OneToMany

- @OneToOne

- @JoinColumn