【问题标题】:hibernate + Oracle 11.2 + BLOB休眠 + Oracle 11.2 + BLOB
【发布时间】:2011-08-24 02:20:17
【问题描述】:

我用谷歌搜索了很多,但没有发现工作问题...在我的网络应用程序中,我需要使用 ajax 上传大文件。我为此使用 ajaxfileupload 插件。在我的 FormBean 类中,我将文件映射到 InputStream:

private InputStream fileData;

@FormParam("file")
@PartType("application/octet-stream")
@JsonIgnore
public void setFileData(InputStream fileData) {
    this.fileData = fileData;
}

它工作正常。我可以将此流保存到一个文件中,并且 java 堆大小没有任何问题。现在我正在尝试使用 Hibernate 将其保存到数据库中。像这样:

repFile.setFileData(session.getLobHelper().createBlob(file.getFileData(), 1024L));

当我保存 repFile 对象时,我有 ORA-01461 可以绑定 LONG 值,仅用于插入到 LONG 列中。 它适用于 Oracle 10。但它与 Oracle 11.2 一起崩溃 我试图将 lobHandler 添加到我的配置中 - 没有帮助

<property name="lobHandler">
        <bean class="org.springframework.jdbc.support.lob.OracleLobHandler">
            <property name="nativeJdbcExtractor">
                <bean class="org.springframework.jdbc.support.nativejdbc.CommonsDbcpNativeJdbcExtractor"/>
            </property>
        </bean>
    </property>

并将批量大小设置为 0 并允许流

<prop key="hibernate.jdbc.use_streams_for_binary">true</prop>
            <prop key="hibernate.jdbc.batch_size">0</prop>

这也无济于事...有人对此有解决方案吗?任何帮助都会很好。

【问题讨论】:

    标签: oracle hibernate jdbc blob


    【解决方案1】:

    你需要像这样映射域类:

    @javax.persistence.Lob
    private java.sql.Blob fileData;
    

    另外,请确保在数据库中将列创建为“BLOB”。

    最后,我建议您不要在 FormBean 中使用“InputStream”,而是使用“MultiPartFile”之类的东西,因为您只能读取一次 InputStream(除非您倒带/重置它)。此外,MultiPartFile 会为您提供文件名和长度。

    【讨论】:

      猜你喜欢
      • 2015-02-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-09
      • 2014-04-14
      • 2010-11-14
      • 2017-01-16
      相关资源
      最近更新 更多