使用Hibernate和Spring创建Blob

时间:2016-01-13 12:09:04

标签: java spring hibernate jpa jdbc

我使用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对象在创建事务的持续时间内有效。

很抱歉提出愚蠢的问题,但我找不到满意的答案。

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

2 个答案:

答案 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;
}