관리 메뉴

IT.FARMER

JPA Inner Join , left join 본문

Spring/Spring Data JPA

JPA Inner Join , left join

아이티.파머 2020. 9. 8. 10:49
반응형

JPA Inner Join , left join

JPA로 저장이 잘되던 내역이 갑자기 저장이 되지 않고 중복에러를 뱉어 냈다. 어째든 내가 어딘가를 수정 했겠지.. save 시에 저장되는 쿼리를 살펴 보니 inner join 형태로 조인되어 지고 있었다. 1:1 관계로 맺어둔 엔티티들이 문제였다. (이래서 왠만하면 1:N 으로 묶는구나 싶었다.)

1:1 상황에서 연관된 객체를 영속성있게 해주지 않으면 부모 객체의 PK 값만 넣어줬을때 조회후 중복으로 체크되어 if (entityInformation.isNew(entity)) 에서 true로 merge 되도록 하지만 중복 오류가 발생된다. merge문을 타도록 되어 있지만 sql 로그에 찍히는 걸보면 insert 문이 찍힌다. - 연관된 1:1 객체는 모두 영속성있게 처리 할것.

@OneToOne 옵션에서 optional=false 로 객체가 null 인경우를 허용하지 않도록 해두면 조인시 inner join 으로 동작되고 optional=true 로하면 left outer join 으로 동작된다.

/**
 * 구입기록 목록. {양방향 사용 하지 않음}
 */
@OneToOne(mappedBy = "localBeefManagement"
        , fetch = FetchType.LAZY
        , cascade = {CascadeType.MERGE, CascadeType.PERSIST, CascadeType.REFRESH}
        , optional = true)
@JsonManagedReference("cattleBuyInformation")
private CattleBuyInformation cattleBuyInformation;

/**
 * 판매지정보 목록.
 */
@OneToOne(mappedBy = "localBeefManagement"
        , cascade = {CascadeType.MERGE, CascadeType.PERSIST, CascadeType.REFRESH}
        , fetch = FetchType.LAZY
        , optional = true)
@JsonManagedReference("cattleSellStoreInformation")
private CattleSellStoreInformation cattleSellStoreInformation;

 

Hibernate: 
    select
        localbeefm0_.entity_identification_number as entity_i1_7_2_,
        localbeefm0_.entity_management_number as entity_m2_7_2_,
        localbeefm0_.birth_day as birth_da3_7_2_,
        localbeefm0_.castration_date as castrati4_7_2_,
        localbeefm0_.created_time as created_5_7_2_,
        localbeefm0_.delete_yn as delete_y6_7_2_,
        localbeefm0_.ear_tag_date as ear_tag_7_7_2_,
        localbeefm0_.enter_date as enter_da8_7_2_,
        localbeefm0_.gender as gender9_7_2_,
        localbeefm0_.location as locatio10_7_2_,
        localbeefm0_.modified_time as modifie11_7_2_,
        localbeefm0_.parent_mom_no as parent_12_7_2_,
        localbeefm0_.parent_papa_no as parent_13_7_2_,
        localbeefm0_.sell_yn as sell_yn14_7_2_,
        localbeefm0_.user_id as user_id15_7_2_,
        cattlebuyi1_.entity_identification_number as entity_i1_1_0_,
        cattlebuyi1_.entity_management_number as entity_m2_1_0_,
        cattlebuyi1_.buy_date as buy_date3_1_0_,
        cattlebuyi1_.buy_note as buy_note4_1_0_,
        cattlebuyi1_.buy_phone_number as buy_phon5_1_0_,
        cattlebuyi1_.buy_sell_phone_number as buy_sell6_1_0_,
        cattlebuyi1_.buy_store_name as buy_stor7_1_0_,
        cattlebuyi1_.created_time as created_8_1_0_,
        cattlebuyi1_.modified_time as modified9_1_0_,
        cattlesell2_.entity_identification_number as entity_i1_2_1_,
        cattlesell2_.entity_management_number as entity_m2_2_1_,
        cattlesell2_.beef_grade as beef_gra3_2_1_,
        cattlesell2_.created_time as created_4_2_1_,
        cattlesell2_.dressed_weight as dressed_5_2_1_,
        cattlesell2_.liveweight as liveweig6_2_1_,
        cattlesell2_.modified_time as modified7_2_1_,
        cattlesell2_.number_of_month as number_o8_2_1_,
        cattlesell2_.sell_date as sell_dat9_2_1_,
        cattlesell2_.sell_note as sell_no10_2_1_,
        cattlesell2_.sell_phone_number as sell_ph11_2_1_,
        cattlesell2_.selling_price as selling12_2_1_,
        cattlesell2_.store_name as store_n13_2_1_ 
    from
        local_beef_management localbeefm0_ 
    inner join
        cattle_buy_information cattlebuyi1_ 
            on localbeefm0_.entity_identification_number=cattlebuyi1_.entity_identification_number 
            and localbeefm0_.entity_management_number=cattlebuyi1_.entity_management_number 
    inner join
        cattle_sell_store_information cattlesell2_ 
            on localbeefm0_.entity_identification_number=cattlesell2_.entity_identification_number 
            and localbeefm0_.entity_management_number=cattlesell2_.entity_management_number 
    where
        localbeefm0_.entity_identification_number=? 
        and localbeefm0_.entity_management_number=?

 

쿼리가 변경된 내역을 확인하면 optional 설정에 따라 join 타입이 변경되는걸 확인 할 수 있다.

 

Hibernate: 
    select
        localbeefm0_.entity_identification_number as entity_i1_7_2_,
        localbeefm0_.entity_management_number as entity_m2_7_2_,
        localbeefm0_.birth_day as birth_da3_7_2_,
        localbeefm0_.castration_date as castrati4_7_2_,
        localbeefm0_.created_time as created_5_7_2_,
        localbeefm0_.delete_yn as delete_y6_7_2_,
        localbeefm0_.ear_tag_date as ear_tag_7_7_2_,
        localbeefm0_.enter_date as enter_da8_7_2_,
        localbeefm0_.gender as gender9_7_2_,
        localbeefm0_.location as locatio10_7_2_,
        localbeefm0_.modified_time as modifie11_7_2_,
        localbeefm0_.parent_mom_no as parent_12_7_2_,
        localbeefm0_.parent_papa_no as parent_13_7_2_,
        localbeefm0_.sell_yn as sell_yn14_7_2_,
        localbeefm0_.user_id as user_id15_7_2_,
        cattlebuyi1_.entity_identification_number as entity_i1_1_0_,
        cattlebuyi1_.entity_management_number as entity_m2_1_0_,
        cattlebuyi1_.buy_date as buy_date3_1_0_,
        cattlebuyi1_.buy_note as buy_note4_1_0_,
        cattlebuyi1_.buy_phone_number as buy_phon5_1_0_,
        cattlebuyi1_.buy_sell_phone_number as buy_sell6_1_0_,
        cattlebuyi1_.buy_store_name as buy_stor7_1_0_,
        cattlebuyi1_.created_time as created_8_1_0_,
        cattlebuyi1_.modified_time as modified9_1_0_,
        cattlesell2_.entity_identification_number as entity_i1_2_1_,
        cattlesell2_.entity_management_number as entity_m2_2_1_,
        cattlesell2_.beef_grade as beef_gra3_2_1_,
        cattlesell2_.created_time as created_4_2_1_,
        cattlesell2_.dressed_weight as dressed_5_2_1_,
        cattlesell2_.liveweight as liveweig6_2_1_,
        cattlesell2_.modified_time as modified7_2_1_,
        cattlesell2_.number_of_month as number_o8_2_1_,
        cattlesell2_.sell_date as sell_dat9_2_1_,
        cattlesell2_.sell_note as sell_no10_2_1_,
        cattlesell2_.sell_phone_number as sell_ph11_2_1_,
        cattlesell2_.selling_price as selling12_2_1_,
        cattlesell2_.store_name as store_n13_2_1_ 
    from
        local_beef_management localbeefm0_ 
    left outer join
        cattle_buy_information cattlebuyi1_ 
            on localbeefm0_.entity_identification_number=cattlebuyi1_.entity_identification_number 
            and localbeefm0_.entity_management_number=cattlebuyi1_.entity_management_number 
    left outer join
        cattle_sell_store_information cattlesell2_ 
            on localbeefm0_.entity_identification_number=cattlesell2_.entity_identification_number 
            and localbeefm0_.entity_management_number=cattlesell2_.entity_management_number 
    where
        localbeefm0_.entity_identification_number=? 
        and localbeefm0_.entity_management_number=?

 

반응형

'Spring > Spring Data JPA' 카테고리의 다른 글

mybatis association, inner class , embeded  (0) 2021.04.29
mybatis 문법 foreach  (0) 2021.04.29
JPA paging 속성  (0) 2020.07.23
QueryDsl Mysql DATE_ADD, ADDDATE  (0) 2020.05.26
QueryDsl Null 인경우 다른 값으로 채우기 coalesce  (0) 2020.05.26