hibernate + Oracle 11.2 + BLOB

时间:2011-05-12 12:32:59

标签: oracle hibernate jdbc blob

我google了很多,但没有找到工作问题...在我的网络应用程序中,我需要使用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>

这也没有帮助......有没有人有这方面的解决方案?任何帮助都会很好。

1 个答案:

答案 0 :(得分:0)

您需要像这样映射域类:

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

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

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