| DB 테이블간의 관계
엔티티
- 부모 엔티티: 먼저 자료가 저장되어 있어야 할 쪽
- 자식 엔티티: 부모 엔티티의 PK를 FK로 참조하는 쪽
식별관계
- 주식별관계: 부모엔티티의 PK를 자식엔티티의 PK로 참조
- 비식별관계: 부모엔티티의 PK를 자식엔티티의 일반 컬럼으로 참조
| 연관관계 종류
@ManyToOne
@OneToMany
@OneToOne
- 부모 엔티티/자식 엔티티 객체에서 설정 가능
- 자식 엔티티
- @OneToOne
- @JoinColumn 으로 FK 지정
- @MapsId
- 부모 엔티티
@ManyToMany
| JPA연관관계용 프로퍼티
fetch (SELECT JOIN 용 = 로딩 관련)
- @ManyToOne인 경우(자식쪽에서 부모 참조)
- EAGER(즉시로딩)이 기본값
- (자식입장에서) 자식을 SELECT 할 때 부모를 같이 JOIN 해서 가져오는게 DEFAULT
- @OneToMany인 경우 (부모쪽에서 자식 참조)
- LAZY(지연로딩)이 기본값
- (부모입장에서) 부모를 SELECT 할 때 자식을 JOIN하지 않음
메서드 주의!
- JPA 라이프사이클(Hibernate)용 메서드
- Spring Data JPA용 메서드
cascade (DML 용 =INSERT, UPDATE, DELETE)
cascade는 연관관계되어있는 상태를 함께 바꾸는 것.
- 자식을 바꾸면 연관관계 맺고있는 부모 엔티티도 상태가 바뀜.
(em.persist() 이런거 귀찮으니 Spring Data JPA 메서드 사용)
- @ManyToOne(cascade=CascadeType.PERSIST)
- 자식엔티티 객체가 persist()의 대상이 될 때, 부모엔티티의 객체도 같이 persist()메서드의 대상이 되도록 한다.
- persist의 대상이 되면 1차 캐시 영역으로 들어감 -> SQL 저장소에 INSERT 구문이 쌓일 수 있다.
- 따라서 자식 엔티티 객체가 INSERT 될 때 부모엔티티 객체도 같이 INSERT 되게하라.
- 이런경우 잘 없음 ^^
- @ManyToOne(cascade=CascadeType.PEMOVE)
- 자식엔티티 객체가 remove()의 대상이 될 때, 부모엔티티의 객체도 같이 remove()메서드의 대상이 되도록 한다.
- 즉, 자식 DELETE 할 때 부모도 DELETE...?
- 매우매우매우 특수한 경우 빼고 이러면 안되는거 잘 아시죠
- @OneToMany(cascade=CascadeType.PERSIST
- 부모엔티티 객체가 persist()의 대상이 될 때, 자식엔티티의 객체도 같이 persist() 메서드의 대상이 된다.
- 주문정보가 insert되면 주문상세도 같이 insert되는 경우!
- @OneToMany(cascade=CascadeType.REMOVE
- 부모엔티티 객체가 remove()의 대상이 될 때, 자식엔티티의 객체도 같이 remove() 메서드의 대상이 된다.
- 손주뻘 엔티티 있다면 위험하다.
- 주문기본정보쪽에서 설정 가능
merge()하면 다시 1차캐시 상태로 변함
insert()용인지 update()용인지 알아야함.
1차 캐시에서 뺄때도 완전 분리인지, 1차 캐시에서 완전히 삭제인지 구분해야한다.
- REFRESH는 클리어. context 비우기~
- REMOVE는 1차캐시에서 완전 삭제
- 영속성전이를 하는 곳에서는 PERSIST + MERGE
- insert가 될 때는 PERSIST, UPDATE 할때는 MERGE의 대상이 된다
- save()하면 경우에 따라 알아서 INSERT 또는 UPDATE 구문이 처리된다.
- deleteById(); delete() --> DELETE 처리 --> REMOVE 자식입장에서 하면 안됨
mappedBy