How to write java.sql.Blob to JPA entity?

后端 未结 2 1320
野的像风
野的像风 2020-12-24 11:49

I have a JPA entity with java.sql.Blob:

@Entity
public class LargeData {

  @Lob
  private java.sql.Blob data;

  //getters/setters
}

How t

相关标签:
2条回答
  • 2020-12-24 12:24

    Use a byte array:

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

    If you want to use streams, create the blob using Hibernate.createBlob(..)

    0 讨论(0)
  • 2020-12-24 12:27

    use a file stream. However, this appears to have various complications, depending on your database, driver, and JPA implementation. I built a generic solution, that was slow, and failed with large files, then found a Hibernate-specific solution that worked with Oracle 11.2.0.4

    I'm using Spring Data / JPA, but the issue seems to be around Hibernate, not 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);
    }
    

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

    and for retrieval:

    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);
    
    }
    
    0 讨论(0)
提交回复
热议问题