有谁知道休眠版本 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 的行为,因为它曾经是。