【问题标题】:Exclude field while reading in child entity using jpa oracle db使用 jpa oracle db 读取子实体时排除字段
【发布时间】:2016-05-26 04:38:23
【问题描述】:

我想使用 jpa 排除子实体中的一些字段。 例如:

Class Person extends Serializable
{
     private String firstName;
     private String lastName;
     private String id;
     private PersonalInformation personalInformation;
}

Class PersonalInformation extends Serializable
{
     private Date dob;
     private List<PersonalDocument> documents; 
}

Class PersonalDocument extends Serializable
{
     private String fileName;
     private int fileSize;
     private byte[] fileData;
}

当我试图获取一个人的详细信息时,我可以获取关于一个人的所有信息,包括 PersonalInformation 和 PersonalDocument 列表,但是由于 PersonalDocument.fileData 可能很大,每次从 DB 获取此字段都会影响性能.

所以我想在只读时忽略/排除 PersonalDocument.fileData 字段,我想知道如何编写 jpa 查询。

【问题讨论】:

  • 设置字段的 FetchMode,或使用 EntityGraphs 允许您这样做

标签: java oracle hibernate jpa


【解决方案1】:

然后一种解决方案是延迟获取文件数据,即在您访问该字段时从数据库中按需获取。请注意,JPA 规范并不要求提供者实现实际上支持单个字段的延迟加载(而不是关联):此区域中的任何指令都只能被视为对持久性提供者的提示。

我知道 Hibernate 确实支持字段的延迟加载,并且在这方面有很多类似的问题,但我一直无法找到关于确切要求的明确答案。

首先,您需要使用@Lob 注释(http://docs.oracle.com/javaee/6/api/javax/persistence/Lob.html)标记该字段

import javax.persistence.Lob;

public class PersonalDocument implements Serializable
{
     private String fileName;
     private int fileSize;

     @Basic(fetch=LAZY) //optional??
     @Lob
     private byte[] fileData;
}

以下建议默认@Lob 是惰性的,因此我们可能不需要额外的@Basic(fetch=LAZY),但无论如何添加它并没有什么坏处。

https://hibernate.atlassian.net/browse/ANN-418

虽然一些类似的 Stack Overflow 问题似乎表明添加 @Lob 是延迟加载此类字段所需的全部内容,但 Hibernate 文档本身指出延迟字段加载需要字节码增强。

https://docs.jboss.org/hibernate/stable/annotations/reference/en/html_single/

要启用属性级别的延迟获取,您的类必须是 Instrumented:将字节码添加到原始类中以启用此类 功能,请参考 Hibernate 参考文档。如果 您的类没有检测,属性级别的延迟加载是 默默地忽略。

所以,总结一下:

  1. 添加@Lob 看看是否有效。
  2. 如果不行,添加@Basic(fetch=LAZY) 看看是否有效。
  3. 如果没有,请在构建中添加字节码增强功能。

https://docs.jboss.org/hibernate/orm/5.0/topical/html/bytecode/BytecodeEnhancement.html

【讨论】:

    猜你喜欢
    • 2015-04-06
    • 1970-01-01
    • 2021-10-27
    • 1970-01-01
    • 1970-01-01
    • 2017-05-23
    • 1970-01-01
    • 2011-09-25
    • 1970-01-01
    相关资源
    最近更新 更多