Comment écrire du java.SQL.Goutte à JPA entité?

j'ai une entité JPA avec java.SQL.Blob:

@Entity
public class LargeData {

  @Lob
  private java.sql.Blob data;

  //getters/setters
}

Comment créer une instance de cette entité? Je veux mettre BlobsetData() méthode, mais comment obtenir Blob à partir de JPA? java.sql.Blob n'est que de l'interface, il y a des implémentations différentes de différentes bases de données, donc je suppose JPA doit me donner le droit de mise en œuvre. Comment l'obtenir?

31
demandé sur Manuel Drieschmanns 2011-02-17 19:19:24

2 réponses

Utiliser un tableau d'octets:

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

si vous voulez utiliser streams, créez le blob en utilisant Hibernate.createBlob(..)

51
répondu Bozho 2011-02-18 15:04:45

utilisez un flux de fichiers. Cependant, cela semble avoir diverses complications, selon votre base de données, pilote, et la mise en œuvre de JPA. J'ai construit une solution générique, qui était lente, et qui a échoué avec de gros fichiers, puis j'ai trouvé une solution spécifique à L'hibernation qui a fonctionné avec Oracle 11.2.0.4

j'utilise les données de printemps / JPA, mais le problème semble être autour de L'hibernation, pas le printemps.

mise en veille prolongée:

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);
}

Generic 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);
}

et pour récupération:

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
répondu Phil Horder 2015-06-26 10:57:02