연관관계용 프로퍼티

0

개념정리

목록 보기
31/33

테이블 관계

  • 부모 엔티티 : 먼저 자료가 저장돼있어야 하는 쪽
  • 자식 엔티티 : 부모엔티티의 PK를 FK로 참조하는 쪽

식별자 관계

  • 주 식별자 : 부모 엔티티의 pK를 자식 엔티티의 pk로 참조
  • 비 식별자 : 부모 엔티티의 pK를 자식 엔티티의 일반컬럼으로 참조

JPA 연관관계 종류

  1. @ManyToOne : 자식 엔티티 객체에서 설정, @JoinColumn으로 FK컬럼 지정
  2. @OneToMany : 부모 엔티티 객체에서 설정, @JoinColumn으로 FK컬럼 지정
  3. @OneToOne : 부모와 자식간 1:1 관계 , 부모 & 자식에서 설정
  4. @ManyToMany -> 쓰지 말기, erd상으로 만들지도 못하는애임

연관관계용 property

  • fetch: SELECT할 때 부모입장에서 자식까지 같이 join해서 select 해올 것인가 또는 내가 자식인데 자식입장에서 부모까지 같이 select 해올 것인가
    • JOIN과 관련된 설정
    • @ManyToOne: 자식엔티티에 설정. EAGER(즉시로딩)가 기본값, 부모를 같이 join해서 찾아온다.
    • @OneToMany: 부모엔티티에 설정. 부모를 검색할때 자식을 계속 join해오면 퍼포먼스가 떨어지므로 기본값은 LAZY(지연로딩), join해옴
      -> 필요하면 fetch설정 EAGER로 해줌
  • cascade : DML용 (select, insert, update, delete) 영속성전이
    • jpa 라이프사이클에 persist, merge라는 메서드가 있는것이고 이걸 계속 사용하기 귀찮으니까 spring data jpa에서 save라는 메서드 하나로 처리하는 것이다.(알아서 persist 또는 merge)
      -> 엔티티들의 상태도가 바뀌는데 managed /detached/ removed로 바뀔 수 있는데, 이걸 부모가 바뀔때 자식도 바뀌거나 그 반대일때 같이 움직이는걸 cascade라 함.
      지금 사용하는 객체의 상태도가 바뀔 때 연관돼있는 객체들의 상태들도 같이 바뀌게 하는것을 말한다.
    • @ManyToOne(cascade=CascadeType.PERSIST) private 부모엔티티 변수;
      : 자식엔티티객체가 Persist()의 대상이 될 때, 부모 엔티티 객체도 같이 Persist()의 대상이 된다. Persist()메서드의 인자가 된다. -> 1차저장소 안으로 들어간다.(자식이 INSERT될 때 부모도 INSERT되게 하라. SQL저장소에 쌓일 수 있게됨)
      💡 ↳ 이런경우는 거의 없다. 특수한 케이스가 없다면 ..!
    • @OneToMany(cascade=CascadeType.PERSIST) private List<자식엔티티> 변수;
      : 부모엔티티객체가 persist()의 대상이 될 때, 자식 엔티티객체도 persist()의 대상이 된다.
      💡 ↳ 종종 있다. 주문 기본 추가하면서 주문 상세들도 같이 추가할 경우
  • PERSIST, MERGE, REMOVE, DETACH(잠깐 1차캐시에서 제외), REFRESH(clear(), PC를 싹 비웠다가 다시 쓸 수 있는 상태로 만드는 것), REMOVE(1차캐시에서 완전히 나가도록, 없앰), ALL(위의 모든것을 처리하겠다)
  • save()persist()merge()를 같이 처리하는 메서드이기 때문에 Insert = persist, Update = merge의 대상이 되므로 보통 cascade에서 같이 붙어다님
  • remove() : deleteById(), delete() 라는 메서드를 호출할 때. -> DELETE SQL처리 -> 자식엔티티에서는 사용할일 거~의없음. 부모에 넣을때도 손자뻘 엔티티가 없을 경우에 사용 많이 함. 손자 있으면 고려해봐야함
profile
백엔드를 공부하고 있습니다.

0개의 댓글