复制blob hibernate版本4.2.3.Final与4.1.7.Final

时间:2013-08-04 03:52:51

标签: oracle hibernate blob

有谁知道hibernate版本4.2.3.Final改变版本4.1.7的方式。最终复制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时,在hibernate 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的一个特性。

非常感谢有人可以向我解释为什么hibernate改变了以前的复制blob行为。

0 个答案:

没有答案