我使用Spring 4.2.3,Hibernate 5.0.4,JPA 2.1以便在ORM的情况下进行自我训练。今天我学习了如何将Blob存储在Oracle 11.2.0.4 DB中。
在我的应用程序中,我有Service和Dao图层。
问题: 为什么要使用需要当前会话的Blob创建Hibernate.getLobCreator实例?为什么不再使用[Hibernate.createBlob] [3](不访问当前会话)?
在某些情况下,我可能需要初始化Blob字段的瞬态域模型,而无需使用Dao将其保留在DB中。
是否因为(如Blob JavaDoc中所写):
Blob对象在创建事务的持续时间内有效。
很抱歉提出愚蠢的问题,但我找不到满意的答案。
答案 0 :(得分:1)
因为Hibernate.createBlob已经从hibernate中删除了,因为一些增强(我不记得确切的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
这里Blob是java.sql.Blob的类型。不同类的其他blob方法正在实现此接口。因此,无论您使用的是oracle还是sql server,都可以获得正确的Blob ....
因此,如果您使用的是Hibernate 5.x.x,请使用上面的内容。
答案 1 :(得分: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;
}