wonwonk
477
2021-05-21 15:55:41 작성 2021-05-21 15:56:25 수정됨
5
211

JPA 연관관계 질문드립니다.


재 질문입니다.

어제 질문에 대한 답변 감사합니다. 


public class A {

    @Id

    @GeneratedValue(strategy = GenerationType.IDENTITY)

    private Long id;


    @OneToOne

    @JoinColumn(name = "b_id")

    private B b;

    @OneToOne(fetch = FetchType.LAZY, optional = false)

    @JoinColumn(name = "c_id")

    private C c;


public class C {

    @Id

    @GeneratedValue(strategy = GenerationType.IDENTITY)

    private Long id;


    @OneToOne

    @JoinColumn(name = "b_id")

    private B b;

    @OneToOne(fetch = FetchType.LAZY, optional = false)

    @JoinColumn(name = "d_id")

    private D d;


entity 구조는 위와 같습니다.

원하는 방식은 A class 를 조회하면 A+B 쿼리가 날라가는 것인데 잘 동작을 합니다. 

헌데 그 이후에 C class를 참조하여 C+B 의 쿼리가 한번더 날라게됩니다. 

조회 방식은 A class findByid 를 하고있습니다. 

두번째 쿼리를 날라가지 않아도 되는거같은데 날라가고 있는 이유를 모르겠습니다. 어렵네요

이게 어떤것은 동작이 잘 되고 어떤건 저렇게 연관관계의 쿼리가 한번 더 날라가니 뭔가 빼먹은게 있을까요

0
  • 답변 5

  • 쭈꾸마뇽
    141
    2021-05-21 16:20:43

    oneToOne의 관계는 lazy로 설정해도 무조건 eager로 쿼리가 날라갑니다.



  • wonwonk
    477
    2021-05-21 16:36:42

    lazy가 적용이 안되었다면 

    A class 를 조회할때 

    A + B + C 쿼리가 날라가는게 맞지 않는지요?


    첫쿼리는 A+B로 날라가고 이후에 

    C+B가 한번더 날라가고 있습니다.

  • shirohoo
    1k
    2021-05-21 17:03:12

    어제답변의 연장선입니다. C에서 B를 참조하고있는데 optional이 true로 돼있는 상태라 하이버네이트는 null을 넣어줘야할지 프록시를 넣어줘야할지 쿼리를 날려보지 않고 알수없습니다.

  • wonwonk
    477
    2021-05-21 17:17:52
    답변 감사합니다.
  • leafvely
    169
    2021-05-21 22:06:09

    One to One 디폴트로 eager로 날라가는것 같습니다. LAZY로 하세요

  • 로그인을 하시면 답변을 등록할 수 있습니다.