我有一些实体具有懒惰的一对多关系(为简洁省略了逻辑):
@Entity class A{ @OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL) @JoinColumn(name = "a_pk", nullable = false) List blist = new ArrayList<>(); @OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL) @JoinColumn(name = "a_pk", nullable = false) Listclist = 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 dlist = new ArrayList<>(); @OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL) @JoinColumn(name = "c_pk", nullable = false) List elist = new ArrayList<>(); } @Entity class D{ @OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL) @JoinColumn(name = "d_pk", nullable = false) List 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
(换句话说,第一个关联被加载,而不是其他的).
编辑:Alexey Malev建议为别名设置提取模式; 它看起来确实如此.符合以下条件:
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.Final