NamedEntityGraph - JPA / Hibernate 抛出 org.hibernate.loader.MultipleBagFetchException:无法同时获取多个包

2024-04-24

我们有一个项目,需要延迟加载实体的集合,但在某些情况下,我们需要急切地加载它们。我们添加了一个@NamedEntityGraph对我们的实体进行注释。在我们的存储库方法中,我们添加了一个“javax.persistence.loadgraph”提示来急切地加载在所述注释中定义的 4 个属性。当我们调用该查询时,Hibernate 会抛出org.hibernate.loader.MultipleBagFetchException: cannot simultaneously fetch multiple bags.

有趣的是,当我将所有这些集合重新定义为急切获取的 Hibernate 时确实急切地去拿它们没有 MultipleBagFetchException。

这是精炼代码。 实体:

@Entity
@NamedEntityGraph(name = "Post.Full", attributeNodes = {
        @NamedAttributeNode("comments"),
        @NamedAttributeNode("plusoners"),
        @NamedAttributeNode("sharedWith")
    }
)
public class Post {
    @OneToMany(cascade = CascadeType.ALL, mappedBy = "postId")
    private List<Comment> comments;

    @ElementCollection
    @CollectionTable(name="post_plusoners")
    private List<PostRelatedPerson> plusoners;

    @ElementCollection
    @CollectionTable(name="post_shared_with")
    private List<PostRelatedPerson> sharedWith;

}

查询方法(全部挤在一起以使其可发布):

@Override
public Page<Post> findFullPosts(Specification<Post> spec, Pageable pageable) {
    CriteriaBuilder builder = entityManager.getCriteriaBuilder();
    CriteriaQuery<Post> query = builder.createQuery(Post.class);
    Root<Post> post = query.from(Post.class);
    Predicate postsPredicate = spec.toPredicate(post, query, builder);
    query.where(postsPredicate);

    EntityGraph<?> entityGraph = entityManager.createEntityGraph("PlusPost.Full");

    TypedQuery<GooglePlusFullPost> typedQuery = entityManager.createQuery(query);
    typedQuery.setHint("javax.persistence.loadgraph", entityGraph);

    query.setFirstResult(pageable.getOffset());
    query.setMaxResults(pageable.getPageSize());

    Long total = QueryUtils.executeCountQuery(getPostCountQuery(specification));

    List<P> resultList = total > pageable.getOffset() ? query.getResultList() : Collections.<P>emptyList();
    return new PageImpl<P>(resultList, pageable, total);
}

关于为什么这适用于实体级别的急切提取,但不适用于动态实体图,有什么提示吗?


我敢打赌,您认为有效的急切提取实际上工作不正确。

当您急切获取多个“包”(允许重复的无序集合)时,用于执行急切获取(左外连接)的 sql 将返回连接关联的多个结果,如此处所解释的所以答案 https://stackoverflow.com/a/1995244/225217。所以虽然休眠不会抛出org.hibernate.loader.MultipleBagFetchException当你有多个时List由于上述原因,急切地获取它不会返回准确的结果。

然而,当你给查询提供实体图提示时,hibernate 会(正确地)抱怨。Hibernate 开发人员 Emmanuel Bernard 解决了引发此异常的原因 https://hibernate.atlassian.net/browse/HHH-2980:

急切获取本身并不是问题,在一个 SQL 查询中使用多个联接才是问题。不限于静态抓取策略;它从未被支持(属性),因为它在概念上是不可能的。

Emmanuel 在另一条 JIRA 评论中继续说道 https://hibernate.atlassian.net/browse/EJB-346 that,

大多数“非索引”列表或原始集合的使用都是错误的,在语义上应该是集合。

所以最重要的是,为了让多个急切的获取按您的意愿工作:

  • use a Set而不是一个List
  • 坚持List使用 JPA 2 的索引@OrderColumn注解,
  • 如果所有其他方法都失败,则回退到 Hibernate 特定的获取注释(FetchMode.SELECT or FetchMode.SUBSELECT)

EDIT

related:

  • https://stackoverflow.com/a/17567590/225217 https://stackoverflow.com/a/17567590/225217
  • https://stackoverflow.com/a/24676806/225217 https://stackoverflow.com/a/24676806/225217
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

NamedEntityGraph - JPA / Hibernate 抛出 org.hibernate.loader.MultipleBagFetchException:无法同时获取多个包 的相关文章

  • 我在使用 JavaFX 绘制十字时遇到问题

    我正在尝试编写代码 在网格上对角绘制 3 个形状 前两个形状是正方形和圆形 我能做到 然而 第三种形状让我有些悲伤 我应该画一个十字 T 版本 而不是 X 每次我写出代码时 它看起来就像一个侧面 我知道我只是错过了一些简单的东西 但我真的很
  • Hibernate如何使用order by子句按字段总和排序

    如何使用 order by 子句按字段总和排序 Entity class MyClass private int a private int b HQL 工作正常 从 MyClass myclass 中选择 myclass ORDER BY
  • 像 Google Play 商店一样在垂直 RecyclerView 中动态不同图像水平 RecyclerView

    我一直在关注这个教程 http android pratap blogspot co za 2015 12 horizo ntal recyclerview in vertical html http android pratap blog
  • 查找所有数组的长度多维数组,Java

    我想使用多维数组来存储数据网格 但是 我还没有找到一种简单的方法来查找长度2nd数组的一部分 例如 boolean array new boolean 3 5 System out println array length 只会输出3 是否
  • 模式更新后 jOOQ 生成的类的运行时验证?

    我用org jooq util DefaultGenerator在构建过程中生成 jOOQ 类来表示我的数据库模式 当应用程序运行时 架构预计会在应用程序不知情的情况下发生更改 此类更改可能与已生成的代码兼容 也可能不兼容 如何在运行时检测
  • 在 json 中解析尾随字符

    我正在尝试检查 json 是否有效 并且我遇到了奇怪的行为 当我将一些字符附加到可解析的 json 时 jackson 和 gson 都会解析它 并且它们会忽略尾随字符 我想检查 json 是否严格有效 请帮忙 我尝试了几个标志mapper
  • 如何模拟@PrePersist方法?

    如何模拟 PrePersist 方法 例如我实例化的实体的 preInit 我正在使用 TestNG EasyMock 是首选 Test enabled true public void testCreateOrder Instantiat
  • Java - 调整图像大小而不损失质量

    我有 10 000 张照片需要调整大小 因此我有一个 Java 程序来执行此操作 不幸的是 图像的质量损失很大 而且我无法访问未压缩的图像 import java awt Graphics import java awt AlphaComp
  • Eclipse Oxygen - 该项目未构建,因为其构建路径不完整

    我刚刚安装了 Eclipse Oxygen 并尝试在工作台中打开现有项目 但收到此错误 该项目未构建 因为其构建路径不完整 不能 找到 java lang Object 的类文件 修复构建路径然后尝试 建设这个项目 我尝试右键单击该项目 转
  • 在 libgdx 中渲染 box2d

    我有一个使用 FitViewport 的大小为 800x480 的游戏世界 并且最初使用像素渲染 box2d 实体 固定装置 因此所有物理效果都显得浮动且缓慢 查看文档后 我意识到 box2d 使用度量单位 因此我将 box2d 位置和大小
  • SSLContext 初始化

    我正在看JSSE参考指南 我需要获取一个实例SSLContext为了创建一个SSLEngine 所以我可以使用它Netty以启用安全性 获取实例SSLContext I use SSLContext getInstance 我看到该方法被重
  • Eclipse RCP - 将视图与编辑器区域堆叠?

    在开发 Eclipse RCP 应用程序时 是否可以将视图与编辑器区域堆叠在一起 像这样 我有多个列表 表格 我想创建一种预览组合 当通过单击鼠标选择列表上的项目时 我希望我的预览合成显示该项目的数据 如果用户双击某个项目 我想在预览合成后
  • 如何在 QueryDSL 中选择文字

    我目前正在开发一个使用 queryDSL 和 hibernate 的项目 其中它需要一个选择文字 按照发布的示例here https stackoverflow com questions 18691317 querydsl how to
  • 自 JRE 1.7.0_25 起,Batik 无法进行转换

    自从我更新到 JAVA 1 7 0 25 以来 蜡染在应用转换时会抛出异常 堆栈跟踪是 java awt image ImagingOpException Unable to transform src image at java awt
  • Jersey 和 Spring 中的全局异常处理?

    我正在使用 Jersey 和 Spring 3 2 以及 Open CMIS 开发 RESTful Web 服务 我没有使用 Spring 的 MVC 模式 它只是 Spring IOC 和 Jersey SpringServlet 控制器
  • Eclipse Juno 指标插件

    Eclipse JUNO 版本有哪些 Eclipse 指标插件 我尝试了一些通用指标插件 但没有一个能够在 Eclipse 的 JUNO 版本中正常运行 差点忘了 我们正在使用 Java 作为编程语言 我想要诸如圈复杂度 代码行数 方法长度
  • 如何从 Sublime Text 编辑器调试 Java 应用程序

    有时我正在对相当大的 Java 应用程序进行简单的修复 但我不想打开 Eclipse 来执行此任务 Eclipse 启动时间很长 并且由于该项目是由大量子项目构建的 而这些子项目无论如何都是由 Maven 构建的 因此需要很长时间才能使用
  • 如何在 Hibernate 中自动递增复合主键中的 Id?

    我有一个带有复合主键的表 groupId and batchId 实体类看起来像 Entity name EMPLOYEE public class Employee EmbeddedId private EmployeePK employ
  • Volley 在第一次调用方法时返回 null

    我正在尝试使用 volley 从服务器检索数据 但是当我第一次调用此方法时 我收到服务器的响应 但该方法返回 null 如果我第二次调用它 我会得到最后的响应 public String retrieveDataFromServer Str
  • 需要在没有wsdl的情况下调用soap ws

    我是网络服务的新手 这个网络服务是由 siebel 提供的 我需要调用一项网络服务 我的客户向我提供了以下详细信息 这是 SOAP 对于产品 请使用它作为端点 Request

随机推荐

  • 切换分支时发生致命 Git 错误

    错误信息 致命 git checkout 更新路径与切换分支 强制不兼容 如何解决这个 Git 签出错误 通过明确指定 git checkout HEAD blah 而不是仅仅说 git checkout blah 假设您确实想查看文件 然
  • Android 创建 JSON 对象的 JSON 数组

    您好 有谁知道如何创建一个包含对象的数组 每个对象中都包含多个对象 我似乎无法理解它 结构应该是这样的 Array object subobject subobject object subobject subobject 这是我到目前为止
  • 当端点和 PMA 地址均更改时,CubeMX 生成的 USB HID 设备发送错误数据

    我正在调试我正在创建的复合设备的问题 并在新生成的仅 CubeMX 代码中重新创建了该问题 以使其更容易解决 我添加了少量代码main 让我发送 USB HID 鼠标点击 并在按下蓝色按钮时使 LED 闪烁 uint8 t click re
  • i18next 翻译问题

    我仍然尝试使用 i18next 来翻译我的 jQuery 应用程序 解决了一些一般问题后 此处解决 如何使用i18next 翻译问题 https stackoverflow com questions 13005791 how to use
  • 在后台从 url 加载一个大 plist

    我从 url 加载一个大的 plist 文件 我必须等待几秒钟才能使用该应用程序 有什么解决办法吗 如何在后台加载它 是GCD我需要的 如何实施 My code NSString urlStr NSString alloc initWith
  • 带猫头鹰旋转木马的 Fancybox (lazyLoad)

    我正在使用带有lazyLoad选项的Fancybox v3 5 4和Owl carousel v2 3 4 当我们点击照片时 Fancybox 就会弹出照片 然后 如果我们点击几次 下一步 以获取 Fancybox 上的下一张照片 然后关闭
  • Java:URLConnection合理的超时时间

    默认情况下 URLConnection 的超时时间为 0 无限制 XXXXX 的合理值是多少 URL url URLConnection uCon url openConnection uCon setConnectTimeout XXXX
  • 在 O(n) 时间和 O(1) 空间中生成数组的随机排列

    我们必须生成数组 1 2 3 n in O 1 space 我能够做到O n space I did O n 空间解决方案 首先存储数组 然后将其随机化 但是如何在不存储数组的情况下做到这一点O 1 space 我只是生成随机数 而不是存储
  • 随着新数据的出现,如何增量训练 FANN?

    我使用 FANN 库构建并训练了一个神经网络 这是初步培训 大部分数据将在线收集 当在线数据可用时我想要improve使用这些新数据的网络 不是重新训练 而是使之前的训练更加准确 如何用FANN来做这种增量训练呢 从更改为的文件进行训练 s
  • Flask - POST 错误 405 方法不允许

    我刚刚开始学习 Flask 我正在尝试创建一个表单 该表单将允许POST method 这是我的方法 app route template methods GET POST def template if request method PO
  • 这是一个可以将括号中的文本与嵌套括号匹配的正则表达式[重复]

    这个问题在这里已经有答案了 我需要一些帮助来编写一个正则表达式 该正则表达式将括号中的字符串与嵌套括号匹配并以模式开头 注意 父 括号中的文本可以没有嵌套括号 例子 Some text pattern SOME TEXT THAT I WA
  • 如何在python中更改ttk.progressBar颜色

    有谁知道如何更改 ttk progressBar 的颜色 它现在显示绿色 我希望它是蓝色的 import ttk self progressBar ttk Progressbar frame3 length 560 maximum 100
  • Bigquery - json_array 来自字段的额外多个元素

    我的表有一个 JSON 字段 如下所示 每个条目中可以有任意数量的评论 entry 1234 comment 6789 seconds 1614864327 nanoseconds 606000000 message hello world
  • Pandas 数据框获取每组的第一行

    我有一只熊猫DataFrame像下面这样 df pd DataFrame id 1 1 1 2 2 3 3 3 3 4 4 5 6 6 6 7 7 value first second second first second first t
  • 在 OS Hardened 机器中使用 c# 禁用任务管理器

    我使用下面的代码来禁用完美运行的信息亭应用程序的任务管理器 public void DisableTaskManager RegistryKey regkey string keyValueInt 1 string subKey Softw
  • 将数组 php 转换为 java

    我正在开发一个包含 java 文件和 php 文件的应用程序 java 文件调用 php 文件 这些文件在 ddbb 中执行查询并将结果作为数组 php 返回 但将其打印在屏幕上 我在java中把它当作一个字符串 我必须将它转换为数组或集合
  • 将字符串 ascii 转换为字符串 Hex

    假设我有这个字符串 string str 1234 我需要一个函数将该字符串转换为该字符串 0x31 0x32 0x33 0x34 我在网上搜索了很多类似的东西 但没有找到这个问题的答案 string str 1234 char charV
  • 共享图像的正确方法(使用意图)

    我在应用程序中创建图像 并希望共享这些社交网络 facebook 邮件应用程序 gmail 以及其他可以 接收 图像的应用程序 问题的根源 我认为 是我不想使用外部存储作为图像的基础 我想使用我的数据文件夹或缓存文件夹 因为它们都不需要任何
  • 如何使 Selenium WebDriver 动态选择客户端证书而不用视觉检测弹出窗口

    我正在尝试使用 Java 和 Selenium 来测试需要客户端证书的网站 当我浏览我的网站时 我会看到一个如下所示的弹出窗口 以选择正确的证书 我的要求如下 按名称选择证书 在不同版本的 Windows IE Edge 上 理想情况下 永
  • NamedEntityGraph - JPA / Hibernate 抛出 org.hibernate.loader.MultipleBagFetchException:无法同时获取多个包

    我们有一个项目 需要延迟加载实体的集合 但在某些情况下 我们需要急切地加载它们 我们添加了一个 NamedEntityGraph对我们的实体进行注释 在我们的存储库方法中 我们添加了一个 javax persistence loadgrap