Saltar al contenido

Blob de almacenamiento Spring-data-jpa

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.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *