【发布时间】:2016-01-13 12:09:03
【问题描述】:
我正在使用 Spring 4.2.3、Hibernate 5.0.4、JPA 2.1 来进行 ORM 的自我训练。今天我正在学习如何在 Oracle 11.2.0.4 DB 中存储Blob。
在我的应用程序中,我有 Service 和 Dao 层。
问题: 为什么我应该使用需要当前会话的Hibernate.getLobCreator 创建Blob 实例?为什么不能再使用 [Hibernate.createBlob][3] (不访问当前会话)?
在某些情况下,我可能需要初始化 Blob 字段的瞬态域模型,而无需使用 Dao 将其持久化到数据库中。
是因为(如BlobJavaDoc 中所写):
Blob 对象在创建的事务期间有效。
很抱歉问了这么愚蠢的问题,但我找不到满意的答案。
【问题讨论】:
-
或者更重要的是,当其他 JPA 提供者不需要时,为什么有必要使用供应商特定的方法来持久化 Blob?
-
为什么要手动创建 blob?为此,有
@Lob注释...只需将其添加到byte[]或String参数即可。不要自己乱搞(B / C)Lobs(很久以前就是这样做的)。 -
@M.Deinum 谢谢你的回答。您的意思是应该在映射中使用 byte[] 或 String 而不是 (B/C)Lobs 吗?但是在Hibernate 5.0 Lobs Documentation java.sql.Clob 中也使用了字段。
-
将为您完成映射。您真的希望您的实体依赖于 sql 特定类型吗?这基本上将您的整个应用程序与 sql 联系起来。但是
@Lob注释也适用于Blob或Clob字段,但你真的想要这样吗,因为它使编写这些东西变得更加复杂。 -
我想到的另一件事:在我的模型与 Java 字符串池中将 (B/C)Lob 映射为
String不是问题 - 这不是一些原因JVM内存问题?
标签: java spring hibernate jpa jdbc