使用Hibernate以块的形式读/写blob数据

时间:2013-12-16 15:49:28

标签: java oracle hibernate stream blob

是否有办法使用blobHibernate块中读取和写入。 现在我得到OutOfmemoryException,因为整个blob数据在内存中加载到byte[]

更具体地说,假设我想将一个大文件保存到名为File的数据库表中。

public class File {
   private byte[] data;
}

我在FileInputStream中打开文件然后是什么? 我如何告诉Hibernate我需要流式传输内容并且不会立即提供整个byte[]数组? 我应该使用Blob代替byte[]吗?无论如何我如何流式传输内容?

关于阅读,有没有一种方法可以告诉hibernate(除了延迟加载)我需要将blob加载到块中,所以当我检索File时它不应该给我{{ 1}}。

我正在使用:

  • Oracle 11.2.0.3.0
  • Hibernate 4.2.3 Final
  • Oracle Driver 11.2

1 个答案:

答案 0 :(得分:13)

如果使用Blob路由,您是否尝试过使用Hibernate的LobHelper createBlob方法,该方法需要InputStream?要创建Blob并持久保存到数据库,您将提供FileInputStream对象和字节数。

您的文件bean /实体类可以像这样映射Blob(使用JPA注释):

@Lob
@Column(name = "DATA")
private Blob data;

// Getter and setter

业务逻辑/数据访问类可以像这样为你的bean / entity对象创建Blob,注意不要在持久化到数据库之前关闭输入流:

FileInputStream fis = new FileInputStream(file);
Blob data = getSession().getLobHelper().createBlob(fis, file.length());
fileEntity.setData(data);
// Persist file entity object to database

另一种方法是将数据库中的Blob作为块中的流读取,您可以调用Blob的getBinaryStream方法,为您提供InputStream,并允许您在以后根据需要设置缓冲区大小:< / p>

InputStream is = fileEntity.getData().getBinaryStream();

Struts 2 has a convenient configuration available that can set the InputStream result's buffer size