Posterior a indagar en diferentes repositorios y foros al final dimos con la resolución que te mostramos aquí.
Solución:
TL; DR
Puedes ver un proyecto de muestra en mi github. El proyecto muestra cómo transmite datos hacia/desde la base de datos.
Problema
Todos los consejos sobre el mapeo de @Lob
como byte[]
derrota (en mi opinión) la principal ventaja de los blobs: la transmisión. Con byte[]
todo se carga en la memoria. Puede estar bien, pero si vas con LgrandeOobjeto que probablemente desee transmitir.
Solución
Cartografía
@Entity
public class MyEntity
@Lob
private Blob data;
...
Configuración
exponer hibernación SessionFactory y Sesión actual para que puedas hacerte con el LobCreator. En aplicación.propiedades:
spring.jpa.properties.hibernate.current_session_context_class=org.springframework.orm.hibernate5.SpringSessionContext
Exponer sesión de fábrica como frijol:
@Bean // Need to expose SessionFactory to be able to work with BLOBs
public SessionFactory sessionFactory(HibernateEntityManagerFactory hemf)
return hemf.getSessionFactory();
Crear blob
@Service
public class LobHelper
private final SessionFactory sessionFactory;
@Autowired
public LobHelper(SessionFactory sessionFactory)
this.sessionFactory = sessionFactory;
public Blob createBlob(InputStream content, long size)
return sessionFactory.getCurrentSession().getLobHelper().createBlob(content, size);
public Clob createClob(InputStream content, long size, Charset charset)
return sessionFactory.getCurrentSession().getLobHelper().createClob(new InputStreamReader(content, charset), size);
Además, como se señaló en los comentarios, siempre que trabaje con el @Blob
incluida la transmisión que obtiene, debe estar dentro de la transacción. Simplemente marque la parte de trabajo @Transactional
.
Spring Data no maneja BLOB, pero Spring Content sí. Específicamente, Spring Content JPA almacena contenido como BLOB en la base de datos y asocia ese contenido con una Entidad a través de anotaciones.
pom.xml
com.github.paulcwarren
spring-content-jpa-boot-starter
0.0.11
com.github.paulcwarren
spring-content-rest-boot-starter
0.0.11
Entidad.java
@Entity
public class Entity {
@Id
@GeneratedValue
private long id;
@ContentId
private String contentId;
@ContentLength
private long contentLength = 0L;
// if you have rest endpoints
@MimeType
private String mimeType = "text/plain";
DataContentStore.java
@StoreRestResource(path="data")
public interface DataContentStore extends ContentStore
La ventaja de este enfoque sobre la respuesta aceptada es que el Desarrollador no necesita preocuparse por el código repetitivo (el “servicio” en la respuesta aceptada). El BLOB también se expone como Spring Resource dando una interfaz de programación natural. O se puede exportar automáticamente a través de una interfaz REST. Pero nada de esto requiere codificación, en nombre del Desarrollador, además de la configuración de Java y la interfaz de la tienda.
Conecte automáticamente la interfaz de su repositorio y llame al método de guardar pasando su objeto de entidad.
Tengo una configuración similar que funciona bastante bien:
@Autowired
Repository repository;
repository.save(entity);
@Entity
@Table(name = "something")
public class Message {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
@Lob
@Column
private byte[] data;
Aquí tienes las reseñas y valoraciones
No se te olvide dar recomendación a este post si te valió la pena.