본문 바로가기

TIL

[TIL 2022-2-12] JPA 필드와 컬럼 매핑

필드와 컬럼 매핑

@Entity
@Getter
@Setter
@NoArgsConstructor
@SequenceGenerator(name="member_seq_generator",sequenceName = "member_seq", initialValue = 1, allocationSize = 50)
public class Member {
    /*
     * << @GeneratedValue >>
     * 기본키 생성을 데이터베이스에 위임. 세가지 전략이 있음
     *
     * - IDENTITY
     * 데이터베이스에 전략을 위임. MySQL의 경우 Auto_Increment. persist()시 바로 Insert, 그 이후에만 ID값을 알 수 있음
     *
     * - Sequance -> 이걸로 전략 만들어서 사용할 것!
     * 시퀀스 객체를 생성에 기본키값을 받아 세팅. 시퀀스 전략을 개발자가 설정할 수 있음
     *
     * - AUTO
     * 디폴트 값. 디비 방언에 따라 자동으로 생성
     * */
    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "member_seq_generator")
    private Long id;

    /*
     *  << @Column >>
     * name: 데이터베이스에 매핑될 테이블 컬럼의 이름
     * insertable, updatable: 어플리케이션 레벨에서 인설트하 업데이트 가능 불가
     * nullable: null 값의 허용여부 결정
     * unique: UNIQUE 제약조건 설정(잘쓰지않음, 보통 @Table 을 통해 클래스 레벨로 제약조건 적용)
     * columnDefinition: 직접 컬럼 정보를 줄수 있음
     * length: String 타입에만 사용, 타입의 길이를 줄 수 있음 ex) length = 10 -> varchar(10)
     * */
    @Column(name = "name")
    private String username;

    private Integer age;

    /*
     * << @Enumerated >>
     * 무조건 EnumType.String 옵션으로 사용!
     * ORDINAL 로 할 경우 디비에 정수로 저장, Enum의 변경이 있으면 의미가 달라지므로 STRING 으로만 구현!
     * */
    @Enumerated(EnumType.STRING)
    private RoleType roleType;

    @Temporal(TemporalType.TIMESTAMP)  //DATE, TIME, TIMESTAMP
    private Date createdDate;

    @Temporal(TemporalType.TIMESTAMP)
    private Date lastModifiedDate;

    //이렇게만 써도됨 과거에 @Temporal 썼음
    private LocalDateTime localDateTime;
    /*
     * @Lob - 매핑하는 필드 타입이 문자면(String,char[],Clob 등) CLOB 매핑, 나머지는 BLOB 매핑
     *
     * BLOB - 이진 대형 객체 (Binary), 이미지, 동영상, MP3 등...
     * CLOB - 문자 대형 객체 (Character), Oracle Server는 CLOB과 VARCHAR2 사이에 암시적 변환을 수행
     * */
    @Lob
    private String description;

    //데이터베이스에 매핑되지않고 메모리에서만 필요한 데이터 설정
    @Transient
    private int temp;
}

 

- @GeneratedValue 는 SEQUNCE를 쓸 것

identity는 Auto_Increment 처럼 데이터베이스에 위임 persist() 호출할 때마다 네트워크발생, 아이디를 디비에서 받아올 때 까지 알 수 없음

 

- Enum 은 String Type으로 설정

ORDINAL로 할 경우 디비에 정수로 저장, 변경이 있으면 의미가 달라질 수 있다