Hello

파일첨부_파일이름 저장 Entity 설계 및 참조관계

by 볼빵빵오춘기

Point

board_table(부모) - board_file_table(자식) 관계이다. 
따라서 conttraint 로 제약조건을 건다.
(⇒ board_file_table 에 board_id 컬럼은 board_table에 id가 삭제되면 같이 삭제된다.)

board_table
board_file_table

 

BoardFileEntity

  • 클래스 생성, 필드 추가, 참조관계 설정한다. 
  • 참조관계 필드
    • BoardFileEntity와 Board2Entity가 관계를 맺어야한다.
    • BoardFileEntity에서는 Board2Entity과 어떤 관계냐 참조관계를 설정해야한다.
더보기

생각해보면 게시글 하나에 여러 개의 파일이 올 수 있다.

하지만 하나의 파일에 여러 개의 게시물과 매칭할 수 는 없다.

 

⇒ BoardFileEntity 에서는 그러면 N:1 관계인 것!

⇒ @ManyToOne(fetch = FetchType.LAZY) 사용

⇒ fetch = FetchType.LAZY 는 부모와 join을 했을 때는 필요한 상황에 필요정보만 호출해서 쓸 수 있다.

fetch = FetchType.EAGER 도 있는데 이것은 join했을 때 부모 정보, 자식정보 다 가져온다.

⇒ 보통 fetch = FetchType.LAZY 을 많이 사용한다.


⇒ BoardFileEntity에서 Board2Entity에서 DB에 어떤 컬림이 join이 되느냐

@JoinColumn(name = "board_id")

⇒ 실제 DB에는 bigint로 만들어 진다.

⇒ 필드로 정의할 때는 부모로 정의하면 된다.

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

    @Column
    private String originalFileName;

    @Column
    private String storedFileName;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "board_id")
    private Board2Entity boardEntity;

}

 

Board2Entity

참조관계를 설정한다. 

더보기

BoardFileEntity와 Board2Entity가 관계를 맺어야한다.

BoardFileEntity에서는 Board2Entity과 어떤 관계냐 참조관계를 설정해야한다.

 

생각해보면 게시글 하나에 여러 개의 파일이 올 수 있다.

하지만 하나의 파일에 여러 개의 게시물과 매칭할 수 는 없다.

 

⇒ Board2Entity에서는 1:N 관계 인 것!

@OneToMany 사용

mappedBy=”boardEntity” 적힌 부분은

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "board_id")
    private Board2Entity boardEntity; // <= 여기 부분과 맞춰부면된다.

⇒ cascade = CascadeType.REMOVE, orphanRemoval = true (sql 쿼리에서 on delete cascade 설정 해준 부분)


⇒ private List<BoardFileEntity> boardFileEntityList = new ArrayList<>();

⇒ 게시물 하나에 여러개의 파일이 올 수 있으므로 List타입으로 선언한다.

⇒ 그렇다고 해서 DB에 List타입으로 정의되거나 하는건 아니다.

    @OneToMany(mappedBy = "boardEntity", cascade = CascadeType.REMOVE, orphanRemoval = true, fetch = FetchType.LAZY)
    private List<BoardFileEntity> boardFileEntityList = new ArrayList<>();

 

application.properties

ddl-auto 를 create 로 변경한다.

create로 변경해야지만 Entity 변경된 사항이 DB에 다시 설정된다.

#h2 console 
spring.h2.console.enabled=true
spring.h2.console.path=/h2-console

#h2 db
spring.datasource.url=jdbc:h2:tcp://localhost/~/test
spring.datasource.driverClassName=org.h2.Driver
spring.datasource.username=sa
spring.datasource.password=
spring.jpa.database-platform=org.hibernate.dialect.H2Dialect
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.H2Dialect

#hibernate
spring.jpa.properties.hibernate.format_sql=true
spring.jpa.properties.hibernate.show_sql=true
spring.jpa.hibernate.ddl-auto=create

블로그의 정보

Hello 춘기's world

볼빵빵오춘기

활동하기