一尘不染

在hibernate中加载一个Clob

hibernate

关于谷歌搜索,可以找到很多东西,但是我还没有找到解决这个问题的可行方法。

基本上,我想按需加载的特定类上有一个很大的CLOB。天真的方法是:

class MyType {

  // ...

  @Basic(fetch=FetchType.LAZY)
  @Lob
  public String getBlob() {
    return blob;
  }
}

但是,这不起作用,显然是由于我使用的是oracle驱动程序,即Lob对象没有被视为简单的句柄,而是始终被加载。如此一来,我就被我的尝试所吸引。有一种解决方案使用特殊的工具来进行惰性属性加载,但是由于Hibernate文档似乎表明他们对使它正常工作不感兴趣,因此我不愿意这样做。尤其是必须运行一个额外的编译通道。

因此,我设想的下一个解决方案是将该对象分离为另一种类型,并定义一个关联。不幸的是,尽管文档提供了相互矛盾的信息,但对我来说,很明显,延迟加载不适用于具有共享主键的OneToOne关联。我将关联的一侧设置为ManyToOne,但是我不确定在有共享主键时如何执行此操作。

那么,有人可以建议最好的方法吗?


阅读 250

收藏
2020-06-20

共1个答案

一尘不染

根据这个唯一的PostgreSQL实现了斑点为真懒。因此,最好的解决方案是将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;
    }
}
2020-06-20