Java 在hibernate中懒洋洋地加载clob

Java 在hibernate中懒洋洋地加载clob,java,hibernate,jpa,clob,lob,Java,Hibernate,Jpa,Clob,Lob,关于谷歌搜索,有很多东西可以找到,但我还没有找到一个可行的解决方案 基本上,我在一个特定的类上有一个大的CLOB,我想按需加载它。这样做的简单方法是: class MyType { // ... @Basic(fetch=FetchType.LAZY) @Lob public String getBlob() { return blob; } } 但这不起作用,显然是因为我使用的是oracle驱动程序,即Lob对象不被视为简单句柄,而是始终被加载。或者说,我是从

关于谷歌搜索,有很多东西可以找到,但我还没有找到一个可行的解决方案

基本上,我在一个特定的类上有一个大的CLOB,我想按需加载它。这样做的简单方法是:

class MyType {

  // ...

  @Basic(fetch=FetchType.LAZY)
  @Lob
  public String getBlob() {
    return blob;
  }
}
但这不起作用,显然是因为我使用的是oracle驱动程序,即Lob对象不被视为简单句柄,而是始终被加载。或者说,我是从我的突袭中被引导去相信的。有一种解决方案使用特殊的工具来进行惰性属性加载,但Hibernate文档似乎表明,他们对使其正确工作不太感兴趣,所以我不想这样做。尤其是必须运行一个额外的编译过程

所以我设想的下一个解决方案是将这个对象分离为另一种类型,并定义一个关联。不幸的是,虽然这些文档提供了相互冲突的信息,但对我来说很明显,延迟加载对具有共享主键的OneTONE关联不起作用。我将关联的一侧设置为manytone,但我不太确定在有共享主键的情况下如何执行此操作

那么,有谁能建议最好的解决方法吗?

据报道,只有PostgreSQL将Blob实现为真正的懒惰。因此,最好的解决方案是将blob移动到另一个表中。您必须使用共享主键吗?你为什么不这样做:

public class MyBlobWrapper {
    @Id
    public Long getId() {
       return id;
    }
    @Lob
    public String getBlob() {
        return blob;
    }
    @OneToOne(fetch=FetchType.LAZY,optional=false) 
    public MyClass getParent() {
        return parent;
    }
}

您可以尝试将字段从
String
转换为
Clob
(或
Blob
),而不是使用hibernate注释进行平衡:


为我工作(该字段在Oracle上开始缓慢加载)。

由于您似乎正在使用Hibernate,我想知道您的问题是否与以下Hibernate功能有关:

Hibernate3支持延迟获取单个属性。这 优化技术也称为获取组。请注意 这主要是一种营销特征;优化行读取要多得多 比优化列读取更重要。但是,只有加载 在极端情况下,类的某些属性可能很有用。对于 例如,当旧表有数百列和 模型无法改进

惰性属性加载需要构建时字节码指令插入。如果 您的持久类没有得到增强,Hibernate将忽略懒惰类 属性设置并返回到立即获取


请参阅。

旧帖子,但由于@TadeuszKopec-answer,只有一篇帮助了我

看起来很难用JPA延迟加载blob。我尝试了@OneToOne关联,但它比帮助更复杂。 我只是将字节移动到另一个类中,与MyClass没有关联(父级。相同的表,相同的id):

在保存blob之前,请记住刷新父对象:

 em.persist(parent);
 em.flush();
 em.merge(new MyBlobWrapper(parent_id,new byte[1000]));
现在我可以单独加载pdf:

String query1 = " select PDF from MyBlobWrapper PDF where PDF.id = :id";

我只是JPA的初学者,希望这能有所帮助。

你能澄清为什么它不能与Oracle一起使用吗?我把这一点充实了一点,我不完全确定确切的问题是什么(细节上有点模糊)。如果映射存在问题,您能给出一个适当的延迟加载clob的方法吗?如果您在Oracle中尝试了它,但失败了,它是如何失败的?它没有失败,因此hibernate只是在始终获取完整clob的位置生成查询(它在select中),不管它是否被标记为懒惰。sqlserver和jtds驱动程序也会出现这种情况。根本没有延迟加载。blob只是同一个表中的一个字段,因此必须使用共享主键。只要在拥有方设置optional=“false”,您的方法就可以工作。我想当对象为空时,它会坏得很厉害?噢。当然,它永远不会为null,因为主键存在。只有clob字段是空的。有点像,谢谢。:-)这是父端btw(MyType)上的必要映射。您可能希望将其包含在您的答案中:@OneToOne(fetch=FetchType.LAZY,optional=false)完成,我添加了建议的参数。好的,但在您的示例中,它需要位于父端MyClass。这是如何导致字段延迟加载的?据我所知,这只是添加了方便的getter/setter来作为字符串访问lob?@BenGeorge注意,在我的回答中,lob注释放在Clob getter上,而不是问题中的字符串getter上。我不直接使用Clob字段,只是通过一个临时getter。警告:如果我没记错的话,我尝试使用的Hibernate版本是3.2。为了验证加载是否确实是延迟的,我使用Wireshark检查进出数据库的流量。
 em.persist(parent);
 em.flush();
 em.merge(new MyBlobWrapper(parent_id,new byte[1000]));
String query1 = " select PDF from MyBlobWrapper PDF where PDF.id = :id";