0

有谁知道休眠版本 4.2.3.Final 改变了版本 4.1.7.Final 复制 blob 的方式?

这是我在 4.2.3.Final 中遇到的问题。

环境:Hibernate 4.2.3.Final 和 Oracle Oracle Database 11g 第 2 版 (11.2.0.3) JDBC 驱动程序

设想:

实体管理器和 blob 在实体类中定义为:

public class Attachment {
    ...
    @PersistenceContext transiet EntityManager em;
    ...
    @Basic(fetch=FetchType.LAZY)
    @Column (insertable=true,updatable=false,name="document")
    @Blob 
    private Blob document;
    ...
    public InputStream getDocument() { return doc.getBinaryStream(); }

    public void setDocument(InputStream is) { 
        Session hibnernateSession=(Session)em.getDelegate(); 
        LobCreator creator=Hibernate.getLobCreator(hibernateSession); 
        this.document=createBlob(is, is.available()); 
    }
    ...
}

假设我从数据库中获取了一个名为 oldAttachment 的实例,然后我创建了另一个名为 newAttachment 的新实例。

当我想将 blob 数据从 oldAttachment 复制到 newAttachment 时,在休眠 4.1.7.Final 下,我可以简单地执行以下操作:

newAttachment.setDocument( oldAttachment.getDocument() );

然后将 newAttachment 保存到数据库中,它可以完美运行。

现在在hibernate 4.2.3.Final下,如果我按照上图的方式做,会报oracle错误,报错我给了NULL值。

换句话说,hibernate不会从oldAttachment中读取blob流数据,然后为我将数据放入newAttachment中。

相反,它需要我(API 用户)执行实际的复制流操作。

为了从另一个复制 blob,我做了类似的事情:

{
  ...
  BufferedInputStream bin = new BufferedInputStream(  oldAttachment.getDocument() );
  ByteArrayOutputStream baos = new ByteArrayOutputStream();
  byte[] data = new byte[4096];
  int len = 0;
  while( (len=bin.read(data, 0, data.length) != -1 ) {
     baos.write(data, 0, len);
  }
  baos.flush();
  ByteArrayInputStream foo = new ByteArrayInputStream( baos.toByteArray() );
  // then call
  newAttachment.setDocument( foo );
  // then call save newAttachment to database etc.....
  ...
}

所以我想知道这是hibernate的BlobProxy中的一个bug还是hibernate 4.2.3.Final的一个特性。

非常感谢,如果有人可以向我解释为什么休眠改变了复制 blob 的行为,因为它曾经是。

4

0 回答 0