Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用jpa oracle db读取子实体时排除字段_Java_Oracle_Hibernate_Jpa - Fatal编程技术网

Java 使用jpa oracle db读取子实体时排除字段

Java 使用jpa oracle db读取子实体时排除字段,java,oracle,hibernate,jpa,Java,Oracle,Hibernate,Jpa,我想使用jpa排除子实体中的一些字段。 例: Class Person扩展可序列化 { 私有字符串名; 私有字符串lastName; 私有字符串id; 个人信息; } 类PersonalInformation扩展了可序列化 { 私人约会日期; 私人清单文件; } 类PersonalDocument扩展了Serializable { 私有字符串文件名; 私有int文件大小; 私有字节[]文件数据; } 当我试图获取一个人的详细信息时,我可以获取关于一个人的所有信息,包括PersonalInfor

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

Class Person扩展可序列化
{
私有字符串名;
私有字符串lastName;
私有字符串id;
个人信息;
}
类PersonalInformation扩展了可序列化
{
私人约会日期;
私人清单文件;
}
类PersonalDocument扩展了Serializable
{
私有字符串文件名;
私有int文件大小;
私有字节[]文件数据;
}
当我试图获取一个人的详细信息时,我可以获取关于一个人的所有信息,包括PersonalInformation和PersonalDocument列表,但是由于PersonalDocument.fileData可能非常庞大,每次从DB获取此字段都会影响性能


因此,我想在只读时忽略/排除PersonalDocument.fileData字段,我想知道如何为相同的字段编写jpa查询。

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

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

但是,首先,您需要使用@
Lob
注释()

下面的内容表明,
@Lob
在默认情况下是惰性的,因此我们可能不需要额外的
@Basic(fetch=lazy)
,但是无论如何添加它也没有坏处

虽然一些类似的堆栈溢出问题似乎报告说延迟加载此类字段只需添加
@Lob
,但Hibernate文档本身注意到延迟加载字段需要字节码增强

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

因此,总而言之:

  • 添加@Lob,看看它是否有效
  • 如果没有,请添加@Basic(fetch=LAZY)并查看它是否有效
  • 如果不是,则在构建中添加字节码增强

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

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

    但是,首先,您需要使用@
    Lob
    注释()

    下面的内容表明,
    @Lob
    在默认情况下是惰性的,因此我们可能不需要额外的
    @Basic(fetch=lazy)
    ,但是无论如何添加它也没有坏处

    虽然一些类似的堆栈溢出问题似乎报告说延迟加载此类字段只需添加
    @Lob
    ,但Hibernate文档本身注意到延迟加载字段需要字节码增强

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

    因此,总而言之:

  • 添加@Lob,看看它是否有效
  • 如果没有,请添加@Basic(fetch=LAZY)并查看它是否有效
  • 如果不是,则在构建中添加字节码增强

  • 设置字段的FetchMode或使用EntityGraphs允许您这样做设置字段的FetchMode或使用EntityGraphs允许您这样做
    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;
    }
    
    import javax.persistence.Lob;
    
    public class PersonalDocument implements Serializable
    {
         private String fileName;
         private int fileSize;
    
         @Basic(fetch=LAZY) //optional??
         @Lob
         private byte[] fileData;
    }