【问题标题】:I want to insert a file to Oracle using BLOB column type over Hibernate?我想通过 Hibernate 使用 BLOB 列类型将文件插入 Oracle?
【发布时间】:2010-11-17 15:21:48
【问题描述】:

我想将我的文件保存在 Oracle 实例上。我将 Hibernate 用于数据对象。如何将文件插入 Oracle Blob。有这方面的示例代码吗?

【问题讨论】:

  • 你真的需要这样做吗?最好将文件存储在文件系统中的某个位置,并将路径保存在数据库中。让文件系统为文件服务
  • Boris.. 如何管理数据库中的 OLE 对象确实是圣战的主题之一。我真正知道的是,Oracle russia 将自己的文件作为数据库中的 Lob 对象管理。你可以搜索一些相关的话题。
  • @Boris:在数据库中存储 blob 也是有正当理由的。至少,您可以利用数据库已经提供的备份、事务、访问控制和网络访问功能。
  • 我应该将文件存储在 Oracle 上。 @Thilo 我同意你的看法

标签: java oracle hibernate


【解决方案1】:

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

已编辑: 另一件事:Oracle 可以使用 dbms_lob.writeappend() 过程将数据附加到它的 clob\blob 字段,这样您就可以避免将所有文件都放在内存中,但 GC 会以最快的速度执行干净BufferedReader 从文件中读取。而且看起来这不是一项休眠工作...... jdbc 和 PreparedStatements 又回来了。

【讨论】:

    【解决方案2】:

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

    public class InfoMessage {
    
        private byte[] body;
    
        @Lob
        public byte[] getBody() {
            return body;
        }
    
        public void setBody(byte[] body) {
            this.body = body;
        }
    }
    

    并用字节数组设置它。这取决于您使用的文件类。 java.io.File 的第一个谷歌搜索结果。我想这个操作有更好的解决方案。

    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;
    

    }

    【讨论】:

    • 感谢您的回答范格。我正在使用 xml 配置进行休眠而不是注释。
    • @Vanger 我可以在 Oracle 上存储 3GB 文件吗?因为使用此代码,您使用的是整数,字节数组的长度可以是整数的最大值,这小于 3GB 文件。我错了吗?
    猜你喜欢
    • 2016-11-13
    • 1970-01-01
    • 1970-01-01
    • 2014-06-05
    • 2011-02-01
    • 2016-08-15
    • 2014-11-26
    • 2018-01-04
    • 2018-11-13
    相关资源
    最近更新 更多