Spring/Spring boot icia 73일차

Spring boot Pk,FK 참조관계 맺기

swkn 2023. 6. 7. 19:48

Entity에서 테이블을 생성하는데 PK , FK으로 엮는 코드를 살펴봤다.

 

게시판에서 글에는 pk로 id가 있을 것이고 그 글의 첨부파일은 글의 id를 fk로 가지고 있을 것이다.

package com.icia.board.entity;

import lombok.Cleanup;
import lombok.Data;

import javax.persistence.*;

@Data
@Entity
@Table(name = "board_file_table")
public class BoardFileEntity {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Column
    private String originalFileName;

    @Column
    private String storedFileName;

    @ManyToOne // 자식에는 ManyToOne , 부모는 OneToMany
    @JoinColumn(name = "board_id") // 실제 DB에 생성되는 참조 컬럼의 이름
    private BoardEntity boardEntity; // mappedBy = "boardEntity" 반드시 부모Entity타입

자식에는 @ManyToOne 어노테이션

부모는 @OneToMany  어노테이션

@JoinColumn 으로 name을 지은 이름이 실제 데이터베이스에 생성되는 참조 컬럼의 이름이 된다.

mappedBy로 boardEntity가 되어 있는데 반드시 부모 Entity 타입으로 지정해야 한다.

 

    @OneToMany(mappedBy = "boardEntity", cascade = CascadeType.REMOVE, orphanRemoval = true, fetch = FetchType.LAZY)
    private List<BoardFileEntity> boardFileEntityList = new ArrayList<>();
cascade = CascadeType.REMOVE BoardEntity가 삭제될때 연관된 BoardFileEntity도 같이 삭제되도록 설정 , sql에서 delete cascade와 같다.
orphanRemoval = true BoardEntity와 연관된 BoardFileEntity의 참조가 제거되면 자동으로 해당 BoardFileEntity를 삭제하도록 설정한다. 즉 부모 Entity와의 연관 관계가 끊어지면 자동으로 자식 Entity도 삭제된다.
fetch = FetchType.LAZY BoardEntity를 조회할때 BoardFileEntity를 지연로딩으로 가져온다.
즉 , 실제로 필요할 때까지 BoardFileEntity를 로딩하지 않는다.
create table board_file_table (id bigint not null auto_increment, original_file_name varchar(255), stored_file_name varchar(255), board_id bigint, primary key (id)) engine=InnoDB
create table board_table (id bigint not null auto_increment, board_contents varchar(500), board_hits integer, board_pass varchar(20) not null, board_title varchar(50) not null, board_writer varchar(20) not null, created_at datetime, file_attached integer, primary key (id)) engine=InnoDB