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