Я хочу выбрать идентификатор непосредственных отношений, не загружая весь объект. Я думал, что мог сделать эту использующую ленивую загрузку следующим образом:
class Foo {
@OneToOne(fetch = FetchType.LAZY, optional = false)
private Bar bar;
}
Foo f = session.get(Foo.class, fooId); // Hibernate fetches Foo
f.getBar(); // Hibernate fetches full Bar object
f.getBar().getId(); // No further fetch, returns id
Я хочу, чтобы f.getBar () не инициировал другую выборку. Я хочу, в спящем режиме, чтобы дать мне объект прокси, который позволяет мне называть .getId (), на самом деле не выбирая объект Панели.
Что я делаю неправильно?
Используйте стратегию доступа к свойствам
вместо
@OneToOne(fetch=FetchType.LAZY, optional=false)
private Bar bar;
Используйте
private Bar bar;
@OneToOne(fetch=FetchType.LAZY, optional=false)
public Bar getBar() {
return this.bar;
}
Теперь все работает нормально!
Прокси-сервер инициализируется, если вы вызываете любой метод , который не является методом получения идентификатора . Но это просто работает при использовании стратегии доступа к собственности. Имейте это в виду.
Вы можете использовать HQL-запрос. Метод getBar () действительно вернет прокси, который не будет получен, пока вы не вызовете какой-либо метод привязки к данным. Я не уверен, в чем именно твоя проблема. Не могли бы вы дать нам дополнительную информацию?
Просто добавлю к посту Arthur Ronald F D Garcia's: вы можете принудительно открыть доступ к свойствам с помощью @Access(AccessType.PROPERTY)
(или устаревшего @AccessType("property")
), см. http://256stuff.com/gray/docs/misc/hibernate_lazy_field_access_annotations.shtml
Другим решением может быть:
public static Integer getIdDirect(Entity entity) {
if (entity instanceof HibernateProxy) {
LazyInitializer lazyInitializer = ((HibernateProxy) entity).getHibernateLazyInitializer();
if (lazyInitializer.isUninitialized()) {
return (Integer) lazyInitializer.getIdentifier();
}
}
return entity.getId();
}
Работает и для отделенных сущностей.