web-dev-qa-db-ja.com

Java.sql.BlobをJPAエンティティに書き込む方法

Java.sql.BlobのJPAエンティティがあります:

_@Entity
public class LargeData {

  @Lob
  private Java.sql.Blob data;

  //getters/setters
}
_

このエンティティのインスタンスを作成する方法は? setData()メソッドでBlobを設定したいのですが、JPAからBlobを取得するにはどうすればよいですか? _Java.sql.Blob_は単なるインターフェイスであり、データベースごとに異なる実装が存在するため、JPAは適切な実装を提供するものと想定しています。入手方法

32
amorfis

バイト配列を使用します。

_@Lob
@Column(length=100000)
private byte[] data;
_

ストリームを使用する場合は、 Hibernate.createBlob(..) を使用してblobを作成します

53
Bozho

ファイルストリームを使用します。ただし、データベース、ドライバー、および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);

}
4
Phil Horder