Принудительная гибернация для активной загрузки нескольких ассоциаций без изменения отображения

У меня есть несколько сущностей с ленивыми отношениями один ко многим (логика опущена для краткости):

@Entity
class A{
    @OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
    @JoinColumn(name = "a_pk", nullable = false)
    List<B> blist = new ArrayList<>();

    @OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
    @JoinColumn(name = "a_pk", nullable = false)
    List<C> clist = new ArrayList<>();

    @Column(name = "natural_identifier", nullable = false)
    private String id;
}

@Entity
class B{
}

@Entity
class C{
    @OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
    @JoinColumn(name = "c_pk", nullable = false)
    List<D> dlist = new ArrayList<>();

    @OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
    @JoinColumn(name = "c_pk", nullable = false)
    List<E> elist = new ArrayList<>();
}

@Entity
class D{
    @OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
    @JoinColumn(name = "d_pk", nullable = false)
    List<F> flist = new ArrayList<>();
}

@Entity
class E{
}

@Entity
class F{
}

В некоторых (очень редких) случаях я хочу загрузить экземпляр A и все его ассоциации с нетерпением. Причина этого в том, что я хочу внести некоторые изменения в этот экземпляр A и его дочерние элементы в целом, а затем либо сохранить, либо отменить их, в зависимости от ввода пользователя.

Если бы я должен был загружать вещи по мере необходимости, мне пришлось бы заново присоединять сущности к новому сеансу по запросу пользователя, но они изменяются, и изменения не должны сохраняться.

Поэтому я пишу что-то вроде этого:

Session session = sessionFactory.openSession();
s.beginTransaction();
Criteria c = session
                    .createCriteria(A.class)
                    .add(Restrictions.eq("id", someValue))
                    .setFetchMode("blist", SELECT)
                    .setFetchMode("clist", SELECT)
                    .createAlias("clist", "c")
                    .setFetchMode("c.dlist", SELECT)
                    .setFetchMode("c.elist", SELECT)
                    .createAlias("c.dlist", "d")
                    .setFetchMode("d.flist", SELECT);
A a = (A) c.uniqueResult();
session.close(); // line 150

a.getBlist().size(); // line 152 - debug
a.getClist().size(); // line 153 - debug

Когда я пытаюсь получить доступ к вещам, я получаю исключение наline 152:

org.hibernate.LazyInitializationException:
failed to lazily initialize a collection of role: 
A.blist, could not initialize proxy - no Session

Если я изменю стратегию получения наJOIN везде в критериях я получаю одно и то же исключение, но наline 153 (другими словами, первая ассоциация загружается, но не другие).

РЕДАКТИРОВАТЬ: Алексей Малев предложил, чтобы режим выборки был установлен для псевдонима; похоже, это правда. Со следующими критериями:

Criteria c = session
                    .createCriteria(A.class)
                    .add(Restrictions.eq("id", someValue))
                    .setFetchMode("blist", JOIN)
                    .setFetchMode("clist", JOIN);

Я получаю другое исключение: org.hibernate.loader.MultipleBagFetchException: cannot simultaneously fetch multiple bags на линии 149. Таким образом, выборка соединения не вариант.

Вопрос в том, как мне все это загрузить?

Hibernate версия 4.2.12. Окончательный

Ответы на вопрос(3)

Ваш ответ на вопрос