[JPA] 연관관계 매핑

sung eon·2023년 2월 17일
0


| p_table

  • SELECT FROM P JOIN line WHERE p_no = ?
    • 비식별자이자 일대다니까 상품정보는 있으나 상품에 따른 주문 정보가 없을수도 있음
    • 상품 입장에서 어떤 주문에서 이 상품이 쓰였는지 볼 수 있다.
    • line 테이블에 자료가 없어도 보여야 하니까 p에 line이 LEFT OUTER JOIN 되어야 한다.
      • findBy로 SELECT시 LEFT OUTER JOIN이 기본이다.
    • INNER JOIN시 주문된 상품만 보인다.
    • SELECT 구문을 만들 땐
    pr.findById(상품번호);
  • DELETE p WHERE p_no = ?

| info_table

  • SELECT FROM JOIN 시 LEFT OUTER JOIN이 필요없다!
    or.findById(주문번호);
    • findBy시 LEFT OUTER JOIN이 기본으로 되는데 어떡하지?
      • nullable = false 필요!
      • INNER JOIN이 된다.
  • DELETE

DELETE시,

어쨌거나 저쨌거나 line_tbl을 먼저 삭제해야 info, p 삭제가 가능하다.

그러나, 하나를 지우면 다른 연관된 테이블 정보를 다 삭제가 가능하게 하면 안되기 때문에 속성으로 제어를 해줘야한다.

  • 만약 cascade = CascadeType.ALL라면, p 지우면 line 지우고, line쪽에서는 연결되어있는 info도 지우려고한다.
  • 또한 상품 추가할 때 line도 추가하려고함.
    • 영속성 때문에 그런데, 영속성 전이를 끊어주자.
    • 상품 추가하면서 line 같이 추가? 아니지.
  • 참고로 select는 상품에 주문정보가 딸려와야해서 EAGER


따라서, 양방향 cascade = CascadeType.ALL은 좋지않아~
mappedBy로 같이 삭제하고 그럴거 아니니까 @JoinColumn으로 FK 설정


테이블 다 드랍 후, 테스트 돌리기
1. 상품 save
2. 주문 save

  • line, info 같이 등록
  1. info 입장에서 line 셀렉트 되는지 확인
  2. p입장에서 line 셀렉트 되는지 확인
  3. info 삭제시 line도 삭제


  4. p 삭제시 line
    mappedBy = 해주면 다 같이 지워주지만 캐스캐이드를 안쓸거기때문에 조인컬럼으로 해놔서 주문이있을 땐 상품 삭제가 안된다.
    만약 다 삭제해주고 싶으면 mappedBy 살리고 캐스케이드 추가해주면됨

profile
코베베

0개의 댓글