Как загрузить набор объектов, когда используется Hibernate Lazy Fetchtype? - PullRequest
0 голосов
/ 13 июля 2009

У меня есть класс домена Hibernate (скажем, PetOwner) с отношением один ко многим с другим классом (домашние животные)

[PetOwner (1) --------- (*) Pet]

Из-за радикальных изменений, необходимых для улучшения производительности, мне пришлось изменить тип выборки Метод 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 (). Size () необходимо использовать, потому что домашние животные не будут загружены, пока не будет выполнена какая-либо операция в списке. Когда я использую новый метод, LazyInitializationException можно преодолеть. Но это взлом, и я ищу способ сделать это более аккуратно. Есть какие-нибудь предложения?

1 Ответ

1 голос
/ 13 июля 2009

Попробуйте использовать Hibernate # initialize (Object) для инициализации вашего объекта. Это должно разрешить ссылку на коллекцию.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...