11

嗨,我想在休眠状态下从输入流创建一个 blob,但我不知道流的长度。

Hibernate.getLobCreator(sessionFactory.getCurrentSession()).createBlob(stream, length)

如何在不知道流长度的情况下创建 blob?

编辑1

在较旧的休眠版本中,这是可能的

http://viralpatel.net/blogs/tutorial-save-get-blob-object-spring-3-mvc-hibernate/

Blob blob = Hibernate.createBlob(file.getInputStream());

编辑2

好的,但它有一个错误的实现

return new SerializableBlob(new BlobImpl(stream, stream.available()));

stream.available 不是真正的大小

编辑 3

我试过了

session.doWork(new Work() {
            @Override
            public void execute(Connection conn) throws SQLException {
            LargeObjectManager lobj = ((org.postgresql.PGConnection) conn).getLargeObjectAPI();

但 conn 只是来自 c3p0 的 NewProxyConnection。

4

6 回答 6

4

这是我现在正在使用的

Session currentSession = getSessionFactory().getCurrentSession();
Blob blob = Hibernate.getLobCreator(currentSession).createBlob(new byte[0]);
OutputStream setBinaryStream = blob.setBinaryStream(1);
Utils.fastChannelCopy(input, setBinaryStream);
setBinaryStream.close();
于 2015-12-18T15:12:55.903 回答
0

尝试传入 InputStream 和 -1 的长度:

session.getLobHelper().createBlob(stream, -1);

这适用于 SQL Server 2008。Hibernate 似乎将此值直接传递给 JDBC 驱动程序,因此这可能会或可能不会工作,具体取决于您的数据库驱动程序。

注意:如果我传入了不正确的流长度(包括0),我会从Hibernate得到一个DataException(来自驱动:“com.microsoft.sqlserver.jdbc.SQLServerException: The stream value is not the specified length. The specified length是 10,实际长度是 13。”)。长度为-1,它总是工作而没有抱怨,并且数据成功保存到数据库中。

于 2013-11-26T17:10:05.757 回答
0

解决方法可能是将输入流保存到文件中,然后将文件读入 blob。

于 2014-09-26T09:21:48.150 回答
0

我知道我的回答与您的问题有些不同。但这可能会帮助其他登陆这里的人。根据我的要求,我将绝对文件路径作为创建 blob 的输入。如果您也有类似的要求,可以使用以下代码段。

Session session = sessionFactory.getCurrentSession();
File file = new File(filePath);
Blob blob = Hibernate.getLobCreator(session).createBlob(new FileInputStream(file), file.length());

file.length() 将为您提供文件的长度。

于 2016-04-15T10:50:39.010 回答
-1

更改 Dao 中的保存方法如下

@Transactional
public void save(Document document, InputStream inputStream) throws IOException {
    Session session = sessionFactory.getCurrentSession();
    ByteArrayOutputStream buffer = new ByteArrayOutputStream();

    int nRead;
    byte[] data = new byte[16384];

    while ((nRead = inputStream.read(data, 0, data.length)) != -1) {
        buffer.write(data, 0, nRead);
    }

    buffer.flush();
    Blob blob = Hibernate.getLobCreator(session).createBlob(buffer.toByteArray());
    document.setContent(blob);
    session.save(document);
}
于 2013-12-20T11:59:18.667 回答
-2

我认为,这是一个 goog 解决方案,如果将 InputStream 转换为字节数组,那么您可以使用 createBlob 方法,该方法接受字节数组而不是 InputStream 和长度作为参数。对于转换,您可以使用 Apache Commons IO 中的 IOUtils。

Hibernate.getLobCreator(sessionFactory.getCurrentSession()).createBlob(IOUtils.toByteArray(stream)); 
于 2017-04-03T12:20:58.863 回答