2009-07-13 3 views
0

У меня есть класс домена Hibernate (скажем PetOwner) с одного до многих отношениях с другим классом (Животные)Как загрузить набор объектов при использовании Hibernate Lazy Fetchtype?

[PetOwner (1) --------- (*) Домашние животные]

Из-за резкого изменения, необходимого для повышения производительности, мне пришлось изменить тип fetchtype метода getPets() в классе PetOwner, чтобы быть ленивым.

Таким образом, текущее отображение выглядит следующим образом

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

Для некоторых тестовых классов, метод getPets() используется после того, как PetOwner найдена с помощью метода retrievePetOwnerById(). После изменений в отображении это вызывает 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) для инициализации вашего объекта. Он должен решить ссылку на сбор.

Мне любопытно, почему вы хотите «нетерпеливого» извлечения, не задавая тип выборки, чтобы быть нетерпеливым.

Смежные вопросы