2016-01-13 68 views
1

我使用Spring 4.2.3,Hibernate 5.0.4,JPA 2.1用於ORM情況下的自我培訓。今天我正在學習如何在Oracle 11.2.0.4 DB中存儲BlobBlob使用Hibernate和Spring創建

在我的應用程序中,我有Service和Dao層。

問題: 我爲什麼要創建一個使用Hibernate.getLobCreator這就要求當前會話Blob實例?爲什麼不能再使用[Hibernate.createBlob] [3](不訪問當前會話)?

在某些情況下,我可能需要使用Blob字段進行初始化的瞬態域模型,而無需使用Dao將其保存在數據庫中。

是不是因爲(如寫入Blob的JavaDoc):

甲Blob對象是有效的,其中被創建的事務的持續時間。

對不起,問一個愚蠢的問題,但我無法找到滿意的答案。

[3]:https://docs.jboss.org/hibernate/orm/3.5/api/org/hibernate/Hibernate.html#createBlob(java.io.InputStream,長)

+1

或更重要的是,爲什麼需要使用特定供應商的方法,只是堅持的Blob,當其他JPA提供商並不需要它? –

+2

爲什麼你想手動創建一個blob?爲此,有['@ Lob'](http://docs.oracle.com/javaee/6/api/javax/persistence/Lob.html)註釋...只需將它添加到'byte []'或'String'參數並完成它。不要隨便亂動(B/C)Lobs(很久以前就是這麼做的)。 –

+0

@ M.Deinum謝謝你的回答。你的意思是應該在映射中使用byte []還是String,而不是(B/C)Lobs?但是在[Hibernate 5.0 Lobs文檔](http://docs.jboss.org/hibernate/orm/5.0/mappingGuide/en-US/html_single/#basic-lob)中也使用了java.sql.Clob字段。 –

回答

1

因爲Hibernate.createBlob已經從休眠現在刪除,由於一些增強(我不記得確切的JIRA問題:)。你可以在互聯網上找到)。

因此,所有你可以用的是新Hibernate.getLobCreator的東西象下面這樣:

public Blob createBlob(your param) { 
    return Hibernate.getLobCreator(currentSession()).createBlob(); 
} 
// check different method for createBlob as you want to pass params. 
// currentSession is method of HibernateDaoSupport 
// pass your session object instead of above 

這裏斑點是java.sql.Blob中的類型。其他不同類的blob方法正在實現這個接口。所以你會得到適當的Blob無論你使用的是oracle或sql服務器或任何東西....

所以如果你使用Hibernate 5.x.x然後像上面一樣使用。

+0

如果您使用任何最新版本的Hibernate,請使用「@ Lob」註釋的字段。 –

0

好的,我發現如何初始化Blob沒有訪問會話對象的一些軟解決方案。

我用SerialBlob執行。下面是簡單的源代碼示例:

private Blob getBlob(String classpathLocation) { 
    ClassPathResource imageFile = new ClassPathResource(classpathLocation); 

    Blob resource = null; 
    if (imageFile.exists()) { 

     try { 
      try (InputStream inputStream = imageFile.getInputStream()) { 
       resource = new SerialBlob(StreamUtils.copyToByteArray(inputStream)); 
       LOG.warn("Resource loaded from {}", classpathLocation); 
      } 
     } catch (Exception e) { 
      LOG.error(MessageFormat.format("Unable to load resource from {0}", classpathLocation), e); 
     } 
    } else { 
     LOG.warn("Resource do not exist on {}", classpathLocation); 
    } 
    return resource; 
}