본문 바로가기
Java

JPA 엔티티와 테이블 매핑

by 완기 2022. 3. 12.
728x90
반응형
package com.example.jpa.jpademo.Entity;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.hibernate.annotations.DynamicInsert;
import org.hibernate.annotations.DynamicUpdate;
import org.springframework.stereotype.Component;

import javax.persistence.*;
import java.time.LocalDateTime;

@Entity //JPA가 관리
@Table(name = "member") //테이블 매핑을 위한 어노테이션
@Component
@Data
@AllArgsConstructor
@NoArgsConstructor
@DynamicInsert // null인 값을 insert할 때 제외함
@DynamicUpdate // null인 값을 update할 떄 제외함
public class Member {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY) //AI 옵션 자동으로 증가
    private int id;

    @Column(name = "name", nullable = false, unique = true)
    private String name;

    @Column(name = "age", nullable = false)
    private int age;

    @Column(name = "dept", nullable = false)
    private String dept;

    @Column(name = "register_date", columnDefinition = "datetime DEFAULT CURRENT_TIMESTAMP")
    private LocalDateTime register_date;

	@Transient // db에 반영되지 않는 값.
    private String Transient; 

    public Member(String name, int age, String dept) {
        this.name = name;
        this.age = age;
        this.dept = dept;
    }
}

일단 앞서 언급한 것처럼 @Entity 어노테이션이 붙은 클래스는 JPA가 관리하는 객체로 분류되므로,

 

@Entity를 추가.

 

@DynamicInsert
@DynamicUpdate

이 두 가지 어노테이션은 객체를 저장, 수정할 때 null인 값은 제외하고 넣는 옵션이다.

 

멤버를 등록할 때, register_date는 직접 넣지 않을 것이라, 추가했다.

 

@Column(name = "name", nullable = false, unique = true)
private String name;

name은 매핑시킬 컬럼의 이름을 적어주고 nullable은 not null조건이다. 

 

false면 not null조건이 채택이 된 것이고, default는 true기 때문에 null값이 들어갈 수 있다.

unique는 unique 조건이다. 

 

테이블에 유일한 값이 들어가야하는 조건이다.

 

@Column(name = "register_date", columnDefinition = "datetime DEFAULT CURRENT_TIMESTAMP")

columnDefinition은 칼럼을 정의할 수 있다.

 

 

어노테이션에 정의한 대로 하이버네이트가 SQL을 잘 로깅했고,

앞서 정의한

@DynamicInsert
@DynamicUpdate

두 어노테이션 덕에 멤버 객체에 시간을 넣지 않아도 자동으로 들어간다.

 

그 외에 옵션으로 

insertable = false, updatable = false

위 옵션도 가능하다.

 

두 항목은 넣을 수 없고, 업데이트가 안되도록 조건을 건다.

 

 

Transient는 DB에 영향을 받지않는 메모리에서 사용할 값을 의미한다.

 

메인 메서드에 간단하게 저장 로직을 추가했다.

 

Member객체에 register_date가 없다.

 

DB를 확인해보면 값이 잘 들어갔다.

728x90
728x90

댓글