我想在Oracle Instance上保存我的文件。我正在使用Hibernate作为数据对象。如何将文件插入Oracle Blob。有没有示例代码?
答案 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再次回来。