如何使用 JPA - EntityGraph 仅加载实体 @Basic 属性的子集?

2024-02-19

我找到了这个文档 https://docs.oracle.com/javaee/7/tutorial/persistence-entitygraphs.htm关于实体图...读完之后,它给了我一个想法,您可以使用实体图来仅检索实体的子集@Basic给定实体的字段(到目前为止,我已经使用实体图来急切地检索关系,即,例如,加载员工[包括其所有属性]及其关联的部门[包括其所有属性])...

所以,我决定通过一个小测试来尝试一下:

@Entity
@Table(name = "employee")
@NamedEntityGraphs({
    @NamedEntityGraph(
        name = "OnlyName",
        attributeNodes = @NamedAttributeNode(value = "name")
    )
})
public class Employee implements Serializable {
    ...
    @Id
    @Column(name = "code", updatable = false)
    private Long code;

    @Basic(fetch = FetchType.LAZY)
    @Column(name = "name", nullable = false)
    private String name;

    @Basic(fetch = FetchType.LAZY)
    @Column(name = "last_name", nullable = false)
    private String lastName;

    @Lob @Basic(fetch = FetchType.LAZY)
    @Column(name = "picture", nullable = false)
    private byte[] picture;

    public Employee() {
       super();
    }
    ...
}

然后,为了检索我的实体,我使用了以下代码:

    private Employee retrieveFromDatabase(long code) {
        EntityGraph<Employee> graph;                // Material Entity Graph

        Map<String, Object> map = new HashMap<>();

        graph = (EntityGraph<Employee>) this.em.createEntityGraph("OnlyName");
        map.put("javax.persistence.fetchgraph", graph);


        return this.em.find(Employee.class, code, map);
    }

现在,此代码始终返回一个 Employee,其中包含从数据库获取的所有字段;甚至 Hibernate 日志也显示一个选择所有员工字段的查询:

Hibernate: select employee0_.code as code1_0_0_, employee0_.last_name as last_name2_0_0_, employee0_.name as name3_0_0_, employee0_.picture as picture4_0_0_ from employee employee0_ where employee0_.code=? )

当我期待这样的查询时:select employee0_.code as code1_0_0_, mployee0_.name as name3_0_0_ from employee employee0_ where employee0_.code=?

那么,我做错了什么?没有这个功能吗支持的 https://hibernate.atlassian.net/browse/HHH-8776通过休眠?

NOTE:对于测试,我使用 hibernate 5.0.10 和 wildfly10 ...

Thanks!


事实上,你并没有做错什么。然而,您错过了一条重要信息Hibernate ORM 用户指南 (v5.0.x) http://docs.jboss.org/hibernate/orm/5.0/userguide/html_single/Hibernate_User_Guide.html#basic-annotation。在2.3.2节中我们发现:

fetch- FetchType(默认为EAGER)

定义是否应急切或延迟获取此属性。 JPA 表示,EAGER 是对提供者(Hibernate)的要求,即在获取所有者时应获取该值,而 LAZY 只是一个提示,即在访问属性时应获取该值。Hibernate 会忽略基本类型的此设置除非您使用字节码增强。请参阅字节码增强 http://docs.jboss.org/hibernate/orm/5.0/userguide/html_single/Hibernate_User_Guide.html#BytecodeEnhancement有关获取和字节码增强的更多信息。

所以:即使您向em.find(..)方法,这取决于 JPA 提供者 - 这里:Hibernate - 来决定是否急切地获取基本属性。就你而言,Employee实体仅包含@Basic属性。

作为参考,以及更多上下文和更详细的解释,另请参阅此tutorial https://www.logicbig.com/tutorials/java-ee-tutorial/jpa/entity-graph-basic-use.html。它涵盖了之间的差异"javax.persistence.fetchgraph" and "javax.persistence.loadgraph"查询提示和示例代码演示了 JPA 持久性提供程序 Hibernate 的上述行为。

旁注:我检查过..

  • ..Hibernate ORM 用户指南5.1 http://docs.jboss.org/hibernate/orm/5.1/userguide/html_single/Hibernate_User_Guide.html#basic-annotation, 5.2 http://docs.jboss.org/hibernate/orm/5.2/userguide/html_single/Hibernate_User_Guide.html#basic-annotation, and 5.3 http://docs.jboss.org/hibernate/orm/5.3/userguide/html_single/Hibernate_User_Guide.html#basic-annotation:所有版本都包含关于默认策略的完全相同的声明,以忽略基本属性。
  • .. the official JPA 2.1 specification document http://download.oracle.com/otn-pub/jcp/persistence-2_1-fr-eval-spec/JavaPersistence.pdf. On (PDF) page 117, in Section 3.7.4 we find:

    持久化提供者被允许获取额外的实体状态beyond由获取图或加载图指定。

JPA 规范中的后一个引用支持ORM 用户指南就这样实施就可以了。

我的建议:

调查字节码增强如 Hibernate ORM 用户指南所述(见上文)。

希望能帮助到你。

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

如何使用 JPA - EntityGraph 仅加载实体 @Basic 属性的子集? 的相关文章

随机推荐

  • 构建无法从 VisualStudio 运行,但可以从 msbuild 运行

    从 Visual Studio 中的全新控制台应用程序模板中 我编辑了 csproj构建另一个这样的项目
  • 单选按钮多项选择

    我有许多具有不同名称属性的单选按钮 我面临一个问题 每次我单击每个单选按钮时 我都可以选择全部 我正在使用单选按钮重定向到其他页面 我不想只选择一项 我正在使用 twitter bootstrap 选项卡在一页上显示多个内容 只需切换选项卡
  • 未捕获对象错误:无法注入 ngAnimate

    当我尝试像这样注入 ngAnimate 时 我无法实例化我的应用程序 var app angular module musicsa ngCookies ngResource ngSanitize ui router firebase ngA
  • 基本日期之间查询 $gte、$lte 等

    我在 mongo 查询的正确时间格式方面遇到问题 我的问题是 Is time Timemongo ISODate 对象的正确 go 类型 为什么我的时间解析似乎解析完全不同的日期 这是我正在做的事情的完整示例 package main im
  • 如何使用 ngrok 托管 HTML 文件?

    是否可以使用 NGROK 托管 HTML 文件 而不是 Web 应用程序 我真的对 NGROK 一无所知 我只是用它来托管 Twilio 应用程序的服务器 并且想用它来托管我的另一个项目的 HTML 文件 另外 有人知道如何在 Mac 上创
  • CSS 转换在 IE 中不起作用

    我无法在 IE 或 Firefox 中实现此转换 但在 Safari 和 Chrome 中看起来不错 不透明度显示但是即时的 对我来说 下面的 CSS 看起来是正确的 但我看不出它有任何理由可以在 IE 或 Firefox 中工作 我已经使
  • 我在编译时遇到找不到符号错误

    import java io File import java io BufferedReader import java io InputStreamReader import java io import java io InputSt
  • 如何通过 URL 访问 Jenkins 在 lastSuccessfulBuild 中创建的工件?

    我正在使用 Jenkins 管道构建 Android 应用程序 构建成功完成后 它会创建一个 apk 文件 我希望 QA 团队的成员能够下载此文件并在将其上传到 Google 商店之前测试该应用程序 因此我希望这些用户 有权访问 Jenki
  • 将项目添加到不可变的 Seq

    假设我有一个字符串序列作为输入 我想获得一个新的不可变的Seq它由输入的元素和一个项目组成 c 以下是我发现有效的两种方法 assert Seq a b c Seq a b Seq c 这个的问题是 似乎实例化了一个临时序列 Seq c 只
  • tkinter:无法进入条目小部件

    我不明白为什么下面的输入框rackGUI py在我的代码中是静态的 不允许输入任何内容 我相信所有的Entry对象被正确实例化 我将文本变量指定为StringVar 我的直觉告诉我问题在于命令参数create button实例化 但我不太确
  • Jsoup 未下载整个页面

    网页是 http www hkex com hk eng market sec tradinfo stockcode eisdeqty pf htm http www hkex com hk eng market sec tradinfo
  • IdentityServer4分别对每个客户端进行身份验证

    我使用两个不同的客户端 IdentityServer4提供API保护和登录表单 我可以配置客户端以避免单点登录吗 我的意思是 即使我登录了第一个客户端 我也需要登录第二个客户端 我的ID4配置 internal static IEnumer
  • Highcharts 进度条形图

    是否可以在 Highcharts 中创建这样的进度图表 https 0 s3 envato com files 84221450 screenshots weblator responsive charts 7 bootstrap jpg
  • Jackson->Jackson + HttpPost =“无效的UTF-8中间字节”,设置Mime和编码

    我在我的客户端中使用 Apache HTTP 客户端库和 Jackson 当我将 JSON 发布到服务器时 出现错误 org codehaus jackson JsonParseException Invalid UTF 8 middle
  • 完全适合初学者使用 Maphilight?

    我正在尝试使用名为 maphilight 的 jquery 插件 我对使用 jquery 插件完全陌生 我对其他网页设计编码有相当多的经验 甚至对 javascript 有一点经验 但实际上尝试像这样实际使用它 这是第一次 我只是无法让这个
  • 运算符重载的基本规则和习惯用法是什么?

    注 答案已在特定订单 但由于许多用户根据投票而不是给出的时间对答案进行排序 因此这里有一个答案索引按照最有意义的顺序 C 中运算符重载的一般语法 https stackoverflow com questions 4421706 opera
  • 使用 Ant 构建 Android 项目 -- 找不到符号

    我正在尝试使用 ant 构建我的 android 项目 它在 eclipse 中运行良好 我运行错误并显示以下构建失败行 BUILD FAILED android sdks tools ant build xml 680 The follo
  • 前台服务在执行互联网相关操作时被杀死

    更新 以前我找不到关于我的前台服务何时被终止的明确定义的模式 经过对发生这种情况的设备 并非所有设备上都发生 进行更多调试后 我发现了 1 很多时候 当我打开 chrome 加载网站时 前台服务会被终止 有时甚至当我使用 Whatsapp
  • 是否可以在同一页面上使用多个 h1 标签,但样式不同?

    我有一个网页 我在各个 DIV 中多次使用 h1 标签 并且我将每个 div 的 h1 样式设置为适当的大小 例如 content h1 font size 22px left nav h1 font size 14px content r
  • 如何使用 JPA - EntityGraph 仅加载实体 @Basic 属性的子集?

    我找到了这个文档 https docs oracle com javaee 7 tutorial persistence entitygraphs htm关于实体图 读完之后 它给了我一个想法 您可以使用实体图来仅检索实体的子集 Basic