[JPA] 연관관계에 자주 쓰이는 property들

sung eon·2023년 2월 17일
0

| DB 테이블간의 관계

엔티티

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

식별관계

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



| 연관관계 종류

@ManyToOne

  • 자식 엔티티 객체에서 설정

@OneToMany

  • 부모 엔티티 객체에서 설정

@OneToOne

  • 부모 엔티티/자식 엔티티 객체에서 설정 가능
  • 자식 엔티티
    • @OneToOne
    • @JoinColumn 으로 FK 지정
    • @MapsId
  • 부모 엔티티
    • @OneToOne(mappedBy = "")

@ManyToMany

  • 현업에서 안쓴다.



| JPA연관관계용 프로퍼티

fetch (SELECT JOIN 용 = 로딩 관련)

  • @ManyToOne인 경우(자식쪽에서 부모 참조)
    • EAGER(즉시로딩)이 기본값
      • (자식입장에서) 자식을 SELECT 할 때 부모를 같이 JOIN 해서 가져오는게 DEFAULT
  • @OneToMany인 경우 (부모쪽에서 자식 참조)
    • LAZY(지연로딩)이 기본값
      - (부모입장에서) 부모를 SELECT 할 때 자식을 JOIN하지 않음

메서드 주의!

  • JPA 라이프사이클(Hibernate)용 메서드
    • persist(), merge...
  • Spring Data JPA용 메서드
    • save() ...

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

profile
코베베

0개의 댓글