Чтобы получить ленивый объект, вам нужно вызвать Hibernate.initialize(proxy)
, например. в вашем классе обслуживания:
public <R> R fetchLazy(T entity, Function<T,R> proxyMapper) {
entity = ensureEntityHasOpenedSession(entity);
R proxy = proxyMapper.apply(entity);
Hibernate.initialize(proxy);
return proxy;
}
За пределами сферы обслуживания нужно было бы позвонить:
AnotherEntity another = service.fetchLazy(entity, Entity::getAnotherEntity);
Теперь вопрос, почему это работает:
another.getId();
при последующем вызове нет:
entity.getAnotherEntity().getId(); // LazyInitializationException
Не было AnotherEntity
сохранено в Entity
после первой выборки? Мне всегда нужно звонить
service.fetchLazy(entity, Entity::getAnotherEntity).getSomething();
Если это так, Hibernate.initialize(Object)
возвращает кэшированный прокси при втором вызове или всегда есть другой доступ к базе данных (выполнение запроса)?
EDIT
Я использую аннотации JPA для полей частного класса в сочетании с lombok @ Getter @ Setter аннотациями.