强制hibernate在不改变映射的情况下急切地加载多个关联

 youstar 发布于 2023-01-15 07:02

我有一些实体具有懒惰的一对多关系(为简洁省略了逻辑):

@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)
    List 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 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

撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有