延迟加载在Hibernate一个CLOB(Lazily loading a clob in hibe

2019-07-30 09:06发布

有很多人能找到有关这个google搜索一下,但我还没有遇不到一个可行的解决这个问题。

基本上,我有什么是我想要的需求,加载了一个特定类大CLOB。 天真的方式做,这将是:

class MyType {

  // ...

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

这可能没有什么工作,显然是由于我使用的是Oracle驱动程序,即前厅对象不被视为简单的手感,但是总是被载入。 或者说,我一直在率领我的突袭相信。 有一个使用专用仪器仪表懒加载特性的一个解决方案,但随着休眠的文档似乎表明他们是小于感兴趣的是该项工作正常,所以我宁愿不走这条路。 尤其是不必运行额外的编译通和所有。

所以,我曾设想在未来溶液中分离出该对象为另一种类型并定义的关联。 不幸的是,当文档就给矛盾的信息,这是显而易见的,我认为延迟加载不上OneToOne协会与共享主键工作。 我设置的关联为多对一的一面,但我不太清楚如何做到这一点时,有一个共享的主键。

因此,任何人可以建议去了解这一点的最好方法是什么?

Answer 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;
    }
}


Answer 2:

而不是做与Hibernate注解equilibristics的,一个可能只是尝试从转换领域的StringClob (或Blob ):

@Lob  
@Basic(fetch=FetchType.LAZY)  
@Column(name = "FIELD_COLUMN")  
public Clob getFieldClob() {  
  return fieldClob;  
}  

public void setFieldClob(Clob fieldClob) {  
  this.fieldClob = fieldClob;  
}  

@Transient  
public String getField()  
{  
  if (this.getFieldClob()==null){  
    return null;  
  }  
  try {  
    return MyOwnUtils.readStream(this.getFieldClob().getCharacterStream());  
  } catch (Exception e) {  
    e.printStackTrace();  
  }  

  return null;  
}  

public void setField(String field)  
{  
  this.fieldClob = Hibernate.createClob(field);  
} 

工作对我来说(场开始懒洋洋地加载,在Oracle)。



Answer 3:

既然你似乎是使用Hibernate我不知道你的问题是涉及到以下休眠功能:

使用延迟属性撷取

Hibernate3的单独的属性支持延迟抓取。 这种优化技术也被称为取出组。 请注意,这是属于市场特性; 优化行读取比列的优化读取更重要。 但是,仅载入类的某些属性可能是在极端情况下是有用的。 例如,在原有表中拥有几百列数据,数据模型无法得到改善。

懒加载特性需要运行时字节码 。 如果你持久化类没有增强,Hibernate会忽略懒属性设置并返回到即时抓取。

见字节码测试对Hibernate使用Maven 。



Answer 4:

旧文章,但只有一个,帮助我,感谢@TadeuszKopec答案。

看起来它是很难做到的blob的延迟加载与JPA。 我试过@OneToOne关联,但它复杂化而不是帮助更多。 我刚搬到字节到另一个类,与MyClass的无关联(父母同桌,同一个ID。):

@Entity
@Table(name="MyTable")
public class MyBlobWrapper{

    @Id
    @Column(name = "id") // id of MyTable, same as MyClass
    private Long id;

    @Lob
    private byte[] bytes;   
}

@Entity
@Table(name="MyTable")
public class MyClass{

    @Id
    @Column(name = "id")
    private Long id;
    // other fields  .....
}

只记得冲洗父,既节省了一滴之前:

 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初学者,希望有所帮助。



文章来源: Lazily loading a clob in hibernate