Будьте в спящем режиме непосредственные: getId (), не выбирая весь объект

Я хочу выбрать идентификатор непосредственных отношений, не загружая весь объект. Я думал, что мог сделать эту использующую ленивую загрузку следующим образом:

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 (), на самом деле не выбирая объект Панели.

Что я делаю неправильно?

60
задан Manuel Drieschmanns 7 November 2017 в 14:08
поделиться

3 ответа

Используйте стратегию доступа к свойствам

вместо

@OneToOne(fetch=FetchType.LAZY, optional=false)
private Bar bar;

Используйте

private Bar bar;

@OneToOne(fetch=FetchType.LAZY, optional=false)
public Bar getBar() {
    return this.bar;
}

Теперь все работает нормально!

Прокси-сервер инициализируется, если вы вызываете любой метод , который не является методом получения идентификатора . Но это просто работает при использовании стратегии доступа к собственности. Имейте это в виду.

См .: Руководство пользователя Hibernate 5.2

38
ответ дан 24 November 2019 в 17:46
поделиться

Вы можете использовать HQL-запрос. Метод getBar () действительно вернет прокси, который не будет получен, пока вы не вызовете какой-либо метод привязки к данным. Я не уверен, в чем именно твоя проблема. Не могли бы вы дать нам дополнительную информацию?

0
ответ дан 24 November 2019 в 17:46
поделиться

Просто добавлю к посту 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();
}

Работает и для отделенных сущностей.

28
ответ дан 24 November 2019 в 17:46
поделиться
Другие вопросы по тегам:

Похожие вопросы: