2013-12-16 27 views
6

有沒有辦法使用Hibernate以塊的形式讀取和寫入blob。 現在我得到OutOfmemoryException,因爲整個blob數據在內存中加載到byte[]使用休眠塊讀取/寫入塊數據

更具體地說,假設我想將一個大文件保存到名爲File的數據庫表中。

public class File { 
    private byte[] data; 
} 

我在FileInputStream中打開文件然後是什麼? 如何告訴Hibernate我需要流式傳輸內容並且不會一次給出整個byte[]數組? 應該用Blob代替byte[]嗎?無論如何,我怎樣才能流內容?

關於閱讀,有沒有一種方法可以告訴休眠(除了懶惰加載它)我需要blob加載成塊,所以當我檢索我的File它不應該給我OutOfMemoryException

我使用:

  • 甲骨文11.2.0.3.0
  • 的Hibernate 4.2.3最終
  • Oracle驅動程序11.2

回答

11

如果要去斑點的路線,你有沒有嘗試過使用休眠的LobHelpercreateBlob方法,這需要一個InputStream?要創建一個Blob並堅持數據庫,您需要提供FileInputStream對象和字節數。

文件豆/實體類可以映射這樣的斑點(使用JPA註解):

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

// Getter and setter 

而業務邏輯/數據訪問類能爲你這樣的豆/實體對象創建的Blob,注意不要堅持到數據庫之前關閉輸入流:

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

爲了走另外一條道路,並從數據庫中讀取斑點作爲塊流,你可以調用斑點的getBinaryStream方法,給你InputStream並允許你設置如果需要,以後的緩衝區大小:

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

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

+0

如何在hbm.xml中定義@Lob(我們在hbm.xml文件中定義我們的域對象)? – Atticus

+0

我相信@Lob註釋是可選的,只要您聲明它是type =「blob」 –

+1

誰將關閉該流? –