spring boot/JPA - 기본

JPA - cascade, orphanRemoval

ballde 2021. 11. 21. 17:38

cascade

엔티티를 영속화할 때 연관된 엔티티도 함께 영속화하는 기능

예) 게시글과 게시글 좋아요의 관계

public class Board {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @OneToMany(mappedBy = "board", cascade = CascadeType.ALL, orphanRemoval = true)
    private final List<BoardLike> boardLikeList = new ArrayList<>();

		.. 생략
}
public class BoardLike {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "board_id", nullable = false)
    private Board board;
		
		private Long memberId;

		.. 생략
}
public void boardAddLike(Long memberId) {
      BoardLike boardLike = BoardLike.of(this, memberId);
      this.boardLikeList.add(boardLike);
  }

게시글에 좋아요 리스트가 있을 경우 boardAddLike(편의 메소드)를 통해서 리스트에 넣어주면

cascade = CascadeType.ALL로 인해서 boardLike를 save하지 않아도 영속화가 되어서 db에 저장이된다.

cascade 종류

  • ALL: 모두 적용
  • PERSIST: 영속
  • REMOVE: 삭제
  • MERGE: 병함
  • REFRESH: refresh
  • DETACH: detach

고아 객체

부모 엔티티와 연관관계가 끊어진 자식 엔티티를 자동으로 삭제

//위에 코드 있음
@OneToMany(mappedBy = "board", cascade = CascadeType.ALL, orphanRemoval = true)
private final List<BoardLike> boardLikeList = new ArrayList<>();
public void boardUnLike(BoardLike boardLike) {
    this.boardLikeList.remove(boardLike);
}

list에서 지울경우 delete 쿼리가 나감

고아 객체와 cascade를 쓰지 말아야 하는 경우

한 테이블이 많은 곳에서 영향을 받는 경우 - 소유자가 하나일 경우만 사용!!

예) image 테이블이 있을경우 member와 연관이 있고 board와도 연관이 있을 경우

'spring boot > JPA - 기본' 카테고리의 다른 글

JPA - proxy(프록시)  (0) 2021.11.13
JPA - 상속관계 매핑  (0) 2021.11.08
JPA - 연관관계 매핑(2)  (0) 2021.11.08
JPA - 연관관계 매핑  (0) 2021.10.26
jpa - 엔티티 매핑  (0) 2021.10.21