2009-07-13 2 views
0

나는 하이버 네이트 도메인 클래스가 다른 클래스 (애완 동물)와 많은 관계로 하나Hibernate Lazy Fetchtype이 사용될 때 객체 세트를로드하는 방법은 무엇입니까?

[PetOwner (1) --------- (*) 애완 동물]

와 (의이 PetOwner을 가정 해 봅시다)

성능을 향상시키기 위해 과감한 변경이 필요했기 때문에 PetOwner 클래스의 getPets() 메소드의 fetchtype을 게으 르도록 변경해야했습니다. 몇 가지 테스트 클래스

@OneToMany(cascade = {CascadeType.ALL}, fetch = FetchType.LAZY, mappedBy = "petowner") 
public Set<Pet> getPets() { 
    if (pets == null) { 
     pets = new HashSet<Pet>(); 
    } 
    return pets; 
} 

다음과 같이

그래서 현재 매핑은 PetOwner가 retrievePetOwnerById() 메소드를 사용하여 발견 된 후 getPets() 메소드를 사용 보인다. 맵핑을 변경 한 후에이 LazyInitializationException이시킨다.

내가에 아래와 같은 방법을 추가하지 않은 고급 해결 방법을 사용 (객체 그래프가 완전히 입력 페치의 변화로 인해로드되지 않기 때문에) DefaultPetOwnerService.

public PetOwner retrievePetOwnerByIdWithPets(Long petOwnerId) { 
     PetOwner petOwner = retrievePetOwnerById(petOwnerId); 
     int size = petOwner.getPets().size(); 
     return petOwner; 
    } 

petOwner.getPets(). 크기는()는 애완 동물이 완료 목록에 대한 몇 가지 동작까지로드되지 않기 때문에 사용할 수 있습니다. 새 메서드를 사용하면 LazyInitializationException을 극복 할 수 있습니다. 그러나 그것은 해킹이며, 나는 이것을 더 깔끔하게 처리하기 위해 길을 찾고 있습니다. . 제안이 있습니까?

답변

1

Hibernate#initialize(Object)을 사용하여 개체를 초기화 해보십시오. 콜렉션 참조를 해결해야합니다.

내가 왜 가져 오기 유형을 열심히 설정하지 않고 "열망하는"페칭을 원하는지 궁금합니다.

관련 문제