У меня есть класс домена 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 можно преодолеть. Но это взлом, и я ищу способ
сделать это более аккуратно. Есть какие-нибудь предложения?