2009-08-07 1 views
0

ファイルをOracleインスタンスに保存します。私はデータオブジェクトのためにHibernateを使用しています。 Oracle Blobにファイルを挿入する方法このためのサンプルコードはありますか?Hibernate上でBLOB列タイプを使用してOracleにファイルを挿入したいのですか?

+0

これは本当に必要ですか?ファイルシステムのどこかにファイルを保存して、データベース内のパスを保存する方がはるかに優れています。ファイルシステムにファイル –

+0

を提供させてください。Boris ..それは、holywarsテーマの1つで、データベース内のOLEオブジェクトを管理する方法です。私が本当に知っていることは、Oracleのロシアが自分のファイルをデータベースのLobオブジェクトとして管理していることです。あなたはそれに関するいくつかの話題を検索することができます。 – Vanger

+1

@Boris:データベースにブロブを格納するのにも有効な理由があります。少なくとも、データベースによってすでに提供されているバックアップ、トランザクション、アクセス制御、およびネットワークアクセスの機能を活用することが最低限です。 – Thilo

答えて

1

まず、エンティティフィールドに@ 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の最初の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; 

}

+0

答えVangerに感謝します。注釈ではなくhibernateのxml構成を使用しています。 – firstthumb

+0

@Vanger 3GBファイルをOracleに保存できますか?このコードでは整数とバイト配列の長さを使用しているので、整数の最大値にすることができますこれは3GB未満のファイルです。私が間違っている? – firstthumb

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[]に変換して別の問題を解決しようとすると、ファイルサイズと同じくらい多くのメモリが必要になります。

EDITED:もう一つ:Oracleが、それはあなたがメモリ内のすべてのファイルを避けることができるようにdbms_lob.writeappend()プロシージャを使用してCLOB \ブロブフィールドをだにデータを追加することができますが、ファイルから読み込んBufferedReaderほど速くきれいに行うGCます。そして、これを行うための休止状態の仕事ではないようです... jdbcとPreparedStatementsが再び戻ってきます。

+0

+1明確な説明のため。ありがとう。私は私の答えを得た。 – firstthumb

関連する問題