iwannajavatop
30
2017-05-23 15:58:58
2
627

spring Data JPA 에서 LAZY 처리 관련


아래와 같은 코드를 작성하여 test 코드를 실행하면 테스트 실패가 되어 질문 드립니다.

제가 알고 있는 바로는 FetchType.LAZY로 설정하게 되면 해당 객체의 필드를 호출 했을 때 DB에서 데이터를 조회하는 것으로 알고 있는데 테스트 케이스에 실패하고 있습니다. (테스트 코드는 아래에 있습니다.)


무엇이 문제인지 hibernate 쿼리 로그를 찍어 보니 다음의 코드가 실행될 때에는 orderProductsEntity 데이터를 가져오기 위한 sql문이 찍히지 않지만

orderService.getOrderDetail(orderId);


아래의 코드를 만났을 때에는 orderProductsEntity 데이터를 가지고 오기 위한 sql 문이 찍힙니다.

assertThat(ordersEntity.getOrderProductsEntity(), is(nullValue())); 


어떤 문제로 이런 현상이 발생하는지 궁금합니다.




##############################
## OrderService 클래스
##############################
public OrdersEntity getOrderDetail(long orderId) {
	return ordersRepository.findOne(orderId);
}


##############################
## OrdersEntity 클래스
##############################

@OneToMany(fetch = FetchType.LAZY, mappedBy = "ordersEntity")
private List<OrderProductsEntity> orderProductsEntity;


##############################
## Test 코드
##############################
@Test
@Transactional
public void testLazy() {
	long orderId = 1212121212121;
        OrdersEntity ordersEntity = orderService.getOrderDetail(orderId);
        assertThat(ordersEntity.getOrderProductsEntity(), is(nullValue()));
    }


0
0
  • 답변 2

  • javaing
    2k
    2017-05-23 23:27:50

    말씀하신대로 해당 객체의 필드를 호출하셨기 때문에 데이터를 불러오지요

    assertThat(ordersEntity.getOrderProductsEntity(), is(nullValue()));

    그리고 null체크 하실때 assertThat말고 assertNull을 사용해보세요

    0
  • iwannajavatop
    30
    2017-05-24 10:14:25

    @javaing

    답변 감사드립니다.

    assertNull도 있었군요.

    그리고 위에서 말씀하신 필드를 호출해서 데이터를 불러왔다고 하셨는데

    제가 알고 있기로는  ordersEntity.getOrderProductsEntity() 호출은 entity의 프록시 객체를 리턴받게 되는 것으로 알고 있어 실제 데이터를 불러오지는 않는다고 들었습니다.


    데이터를 불러들이는 시점은 orderProductsEntity 내부에 존재하는 필드를 호출했을 때 데이터를 가져오는데

    예를 들어 orderProductsEntity에 private String name; 이라는 필드가 존재한다고 가정하고 해당 필드를 다음과 같이 호출해야지만 데이터 로딩이 되는 것으로 알고 있습니다.

    orderProductsEntity.getName() <-- 이 부분을 호출해야지만 데이터를 가져옴


    혹시 제가 모르는 부분이 잇

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