Java.sql.BlobのJPAエンティティがあります:
_@Entity
public class LargeData {
@Lob
private Java.sql.Blob data;
//getters/setters
}
_
このエンティティのインスタンスを作成する方法は? setData()
メソッドでBlob
を設定したいのですが、JPAからBlob
を取得するにはどうすればよいですか? _Java.sql.Blob
_は単なるインターフェイスであり、データベースごとに異なる実装が存在するため、JPAは適切な実装を提供するものと想定しています。入手方法
バイト配列を使用します。
_@Lob
@Column(length=100000)
private byte[] data;
_
ストリームを使用する場合は、 Hibernate.createBlob(..)
を使用してblobを作成します
ファイルストリームを使用します。ただし、データベース、ドライバー、およびJPAの実装に応じて、これにはさまざまな問題が発生するようです。私は一般的なソリューションを構築しましたが、それは遅く、大きなファイルで失敗し、Oracle 11.2.0.4で動作するHibernate固有のソリューションを見つけました
Spring Data/JPAを使用していますが、問題はSpringではなくHibernateにあるようです。
休止状態:
private void testLoadFile() throws SQLException, IOException {
File f = new File("//C:/tmp/6mb_file.wmv");
BufferedInputStream fstream = new BufferedInputStream(new FileInputStream(f));
Session session = entityManager.unwrap(Session.class);
Blob blob = Hibernate.getLobCreator(session).createBlob(fstream, f.length());
FileBLOBEntity file = new FileBLOBEntity();
file.setName("//C:/tmp/6mb_file.wmv");
file.setTheData(blob);
blobRepository.saveAndFlush(file);
}
ジェネリックSpring/JPA:
private void testLoadFile() throws SQLException, IOException {
File f = new File("//C:/tmp/6mb_file.wmv");
BufferedInputStream fstream = new BufferedInputStream(new FileInputStream(f));
Blob blob = connection.getConnection().createBlob();
BufferedOutputStream bstream = new BufferedOutputStream(blob.setBinaryStream(1));
// stream copy runs a high-speed upload across the network
StreamUtils.copy(fstream, bstream);
FileBLOBEntity file = new FileBLOBEntity();
file.setName("//C:/tmp/6mb_file.wmv");
file.setTheData(blob);
// save runs a low-speed download across the network. this is where
// Spring does the SQL insert. For a large file, I get an OutOfMemory exception here.
blobRepository.saveAndFlush(file);
}
および取得用:
public void unloadFile() throws SQLException, IOException {
File f = new File("//C:/tmp/6mb_file.wmv" + "_fromDb");
FileOutputStream fstream = new FileOutputStream(f);
FileBLOBEntity file = blobRepository.findByName("//C:/tmp/6mb_file.wmv");
Blob data = file.getTheData();
InputStream bstream = data.getBinaryStream();
StreamUtils.copy(bstream, fstream);
}