Как получить Hibernate FetchProfile для загрузки глубоких дочерних объектов в иерархии - PullRequest
9 голосов
/ 25 марта 2011

У меня тот же вопрос, что и у кого-то, размещенного в сообществе Hibernate: FetchProfiles .

По причинам производительности у меня есть связь в модели данных следующим образом:

...C -[FetchType.LAZY]-> D -> [FetchType.LAZY] -> E

Используя FetchProfile, я могу с готовностью загрузить D с C, но не могу понять, как с нетерпением загружать E. Я знаю, что могу успешно использовать NamedQuery с использованием внутренних объединений, но это действительно мешает мне, что я не могу разобраться как это сделать с помощью FetchProfile. Пример попытки FetchProfile (все остальное теряется в глубине веков):

@FetchProfile(name = "cwithDAndE", fetchOverrides = {
        @FetchProfile.FetchOverride(entity = C.class, association = "dByCId", mode = FetchMode.JOIN),
        @FetchProfile.FetchOverride(entity = D.class, association = "eByDId", mode = FetchMode.JOIN)
})

Я включаю FetchProfile для сеанса и успешно использую файл session.get без ошибок, а C и D заполнены - E по-прежнему ленив и не заполнен. В отчаянии я помню, как пробовал точечные обозначения для ассоциации от C вниз. Я могу найти только примеры, которые имеют глубину один.

Это пробел типа ОКР в моих знаниях, который нужно заполнить!

Заранее спасибо за любую помощь.

1 Ответ

4 голосов
/ 11 июля 2013

У вас есть A obj, содержащий B obj, содержащий C obj. По умолчанию они

...A -[FetchType.LAZY]-> B -> [FetchType.LAZY] -> C

А класс:

@FetchProfiles({
    @FetchProfile(fetchOverrides = { @FetchOverride(association = "b", entity = A.class, mode = FetchMode.JOIN) }, name = "a-with-b")
    })
@Entity
@Table(name="EDITOR_IDENTITIES")
public class A {
    private B b;    
    //...
}

B класс:

@FetchProfiles({
    @FetchProfile(fetchOverrides = { @FetchOverride(association = "c", entity = B.class, mode = FetchMode.JOIN) }, name = "b-with-c")
    })
@Entity
@Table(name="EDITOR_IDENTITIES")
public class B {
    private C c;    
    //...
}

Класс ADao:

@Repository(value="aDaoImpl")
@Transactional
public class ADaoImpl {

    @Override
    public A loadByPrimaryKey(long id)
    {   
        Session session = sessionFactory.getCurrentSession();
        session.enableFetchProfile("a-with-b");
        session.enableFetchProfile("b-with-c");
        Criteria criteria = session.createCriteria(A.class);
        criteria.add(Restrictions.eq("id", id));
        A a = (A) criteria.uniqueResult();
        if(identity != null)
            return identity;
        else
            return null;
    }
}

вы получите A, заполненный B, заполненный C. Это очень простое решение, вы можете создать метод Dao, принимающий в качестве аргумента список профилей выборки.

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