【问题标题】:Fully load entity with JPA before detaching it?在分离之前使用 JPA 完全加载实体?
【发布时间】:2014-04-11 21:14:44
【问题描述】:

我需要对实体进行一些处理。我希望它在交易之外。问题是这个实体包含一些延迟加载的字段,因此我的程序由于没有活动会话而无法访问其中的一些字段。

最自然的做法是在加载后完全初始化此类实体,但仍处于事务范围内(在分离之前)。但我找不到如何做到这一点。难道真的没有简单的方法来做这样一件小事吗?我想留在 JPA 规范后面。

由于某种原因,在 jpql 中获取所有属性不起作用。

【问题讨论】:

    标签: java jpa entity lazy-evaluation eager


    【解决方案1】:

    只需在要初始化的惰性代理上调用一个方法:

    SomeEntity e = ...;
    e.getFoos().size(); // now foos is initialized
    e.getBar().getName(); // now bar is initialized
    

    要使用 JPQL 一次加载整个状态,您需要使用 fetch joins:

    select e from SomeEntity e
    left join fetch e.foos
    left join fetch e.bar
    where ...
    

    【讨论】:

    • 第二个选项对我来说是一种选择(即使我必须列出大约十几个高度嵌套的属性......),但由于某种原因它不起作用 - 字段仍然是 PersistentSets '未加载(访问它们会导致异常 - “无会话”)。它与级联选项有关吗?我没有在这些字段上定义任何内容。
    • 检查生成的SQL。它应该可以正常工作,即使规范只说 fetch 是一个“提示”。但是没有什么禁止您使用 fetch 连接,并确保使用第一种技术加载所有内容。无论如何,如果没有看到一行代码和对问题的准确描述,就不可能诊断出任何事情。
    • 对不起,你是对的。它现在正在工作。问题是我使用了两个查询并且我编辑了错误的一个。我想没有更简单的方法可以做我想做的事。谢谢!
    猜你喜欢
    • 2014-04-17
    • 2015-08-10
    • 1970-01-01
    • 2015-09-11
    • 2021-01-30
    • 2017-06-05
    • 1970-01-01
    • 1970-01-01
    • 2018-11-28
    相关资源
    最近更新 更多