有谁知道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行为。