我想通过Hibernate使用BLOB列类型向Oracle插入文件?

时间:2009-08-07 08:59:06

标签: java oracle hibernate

我想在Oracle Instance上保存我的文件。我正在使用Hibernate作为数据对象。如何将文件插入Oracle Blob。有没有示例代码?

2 个答案:

答案 0 :(得分:1)

首先,您必须使用@ javax.persistance.Lob注释来注释您的实体字段。 像这样:

public class InfoMessage {

    private byte[] body;

    @Lob
    public byte[] getBody() {
        return body;
    }

    public void setBody(byte[] body) {
        this.body = body;
    }
}

并使用bytes数组设置它。这取决于您使用的File类。 java.io.File的第一个google结果。我想这个操作有更好的解决方案。

public static byte[] getBytesFromFile(File file) throws IOException {
    InputStream is = new FileInputStream(file);
// Get the size of the file
long length = file.length();

if (length > Integer.MAX_VALUE) {
    // File is too large
}

// Create the byte array to hold the data
byte[] bytes = new byte[(int)length];

// Read in the bytes
int offset = 0;
int numRead = 0;
while (offset < bytes.length
       && (numRead=is.read(bytes, offset, bytes.length-offset)) >= 0) {
    offset += numRead;
}

// Ensure all the bytes have been read in
if (offset < bytes.length) {
    throw new IOException("Could not completely read file "+file.getName());
}

// Close the input stream and return bytes
is.close();
return bytes;

}

答案 1 :(得分:1)

@Lob注释不是Hibernate的注释。它是javax.persistence,您可以在任何hibernate映射的实体bean中使用它。 是的,对于这样的例子,大文件是明显的问题。但我找不到这种情况的任何解决方法。 FileInputStream使用int类型值来表示偏移点。 我用类似的问题搜索了这个问题:http://www.coderanch.com/t/449055/Streams/java/JAVA-HEAP-SIZE-files-byte如果您使用Java 1.6,则可以使用SQLPrepareSteatement的解决方案。 Othwerwise你可以尝试使用BufferedReader并以某种方式将结果转换为byteArray[]并尝试击败另一个问题:文件大小需要这么多内存。

EDITED:另一件事:Oracle可以使用dbms_lob.writeappend()过程将数据附加到它的clob \ blob字段,这样就可以避免将所有文件都放在内存中,但GC会像以前一样快速执行清理BufferedReader从文件中读取。似乎这不是一个休眠工作... jdbc和PreparedStatements再次回来。