Forçar a hibernação a carregar ansiosamente várias associações sem alterar o mapeamento

Eu tenho algumas entidades com um preguiçoso para muitos relacionamentos (lógica omitida por brevidade):

@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{
}

Em alguns casos (muito raros), quero carregar uma instância de A e todas as suas associações ansiosamente. A razão para isso é que eu quero fazer algumas modificações nessa instância A e nos filhos como um todo, e depois salvá-las ou descartá-las, dependendo da entrada do usuário.

Se eu fosse carregar as coisas conforme necessário, teria que reconectar as entidades a uma nova sessão mediante solicitação do usuário, mas elas estão sendo modificadas e as modificações ainda não devem ser persistidas.

Então eu escrevo algo assim:

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

Quando tento acessar coisas, recebo uma exceção emline 152:

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

Se eu mudar a estratégia de busca paraJOIN em todos os lugares nos critérios, recebo a mesma exceção, mas emline 153 (em outras palavras, a primeira associação é carregada, mas não as outras).

Edição: Alexey Malev sugeriu que o modo de busca está definido para um alias; parece ser verdade. Com um dos seguintes critérios:

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

Estou recebendo uma exceção diferente: org.hibernate.loader.MultipleBagFetchException: cannot simultaneously fetch multiple bags na linha 149. Portanto, a busca de junção não é uma opção.

A questão é: como faço para carregar a coisa toda?

Hibernate versão 4.2.12.

questionAnswers(3)

yourAnswerToTheQuestion