使用jpa oracle db

时间:2016-05-26 04:38:23

标签: java oracle hibernate jpa

我想使用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查询。

1 个答案:

答案 0 :(得分:0)

然后,一种解决方案是延迟提取文件数据,即在访问该字段时根据需要从数据库中提取。请注意,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/

  

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

所以,总结一下:

  1. 添加@Lob并查看它是否有效。
  2. 如果没有,请添加@Basic(fetch = LAZY)并查看它是否有效。
  3. 如果没有,请在构建中添加字节码增强功能。
  4. https://docs.jboss.org/hibernate/orm/5.0/topical/html/bytecode/BytecodeEnhancement.html