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 Blob
setData()
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?
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(..)
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);
}