테이블 관계
- 부모 엔티티 : 먼저 자료가 저장돼있어야 하는 쪽
- 자식 엔티티 : 부모엔티티의 PK를 FK로 참조하는 쪽
식별자 관계
- 주 식별자 : 부모 엔티티의 pK를 자식 엔티티의 pk로 참조
- 비 식별자 : 부모 엔티티의 pK를 자식 엔티티의 일반컬럼으로 참조
JPA 연관관계 종류
- @ManyToOne : 자식 엔티티 객체에서 설정, @JoinColumn으로 FK컬럼 지정
- @OneToMany : 부모 엔티티 객체에서 설정, @JoinColumn으로 FK컬럼 지정
- @OneToOne : 부모와 자식간 1:1 관계 , 부모 & 자식에서 설정
- @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처리 -> 자식엔티티에서는 사용할일 거~의없음. 부모에 넣을때도 손자뻘 엔티티가 없을 경우에 사용 많이 함. 손자 있으면 고려해봐야함