6.1 Almacenar archivos en el servidor

A veces, los objetos binarios deben guardarse en la base de datos. Por ejemplo, archivos. Si el archivo es grande, lo más razonable es almacenarlo en una carpeta separada en el disco y almacenar sus rutas en la base de datos. Ejemplo:

c:\db-files\users\12355\avatar.jpg

Y en la base de datos almacenamos solo una ruta relativa al archivo:

\12355\avatar.jpg

Es conveniente almacenar una ruta relativa en la base de datos, ya que luego es fácil obtener una URL de ella:

https://storage.codegym.cc/users/12355/avatar.jpg

Simplemente pegamos la ruta relativa al nombre del servidor y listo.

6.2 Almacenar imágenes directamente en la base de datos

Sin embargo, si las imágenes son pequeñas, pueden almacenarse directamente en la base de datos y entregarse al cliente como un conjunto de bytes. Para tales casos, SQL tiene un tipo de datos BLOB especial : Objeto grande binario. O más bien, hay incluso dos de ellos:

  • CLOB - Objeto grande de carácter,
  • BLOB - Objeto binario grande.

CLOB se utiliza para almacenar textos muy grandes. Un BLOB es para almacenar datos binarios, como pequeñas imágenes, videos y similares.

Ejemplo:

@Entity
@Table(name="user")
public class User {

    @Id
    private String id;

	@Column(name = "name", columnDefinition="VARCHAR(128)")
    private String name;

	@Lob
	@Column(name = "photo", columnDefinition="BLOB")
    private byte[] photo;

	// ...
}

La anotación @Loble dice a Hibernate que un objeto grande está almacenado en el campo . Y columnDefinition="BLOB"ya habla de cómo guardarlo todo en la base de datos.

Escribamos un código de ejemplo que guarde un nuevo usuario y su foto en la base de datos:

byte[] imageBuffer = Files.readAllBytes(Paths.get("C:/temp/avatar.png"))

User user = new User();
user.setId("1");
user.setName("Zapp");
user.setPhoto(imageBuffer);

session.persist(user);

6.3 XML y JSON

Hibernate tiene un soporte interesante para JSON como tipo de datos. Le permite guardar un HashMap de cadenas como un solo objeto JSON. Si el DBMS puede funcionar con JSON, se verá así:

@JdbcTypeCode(SqlTypes.JSON)
private Map<String, String> properties;

Hibernate se encarga de que el tipo de objeto Map<String, String>se serialice en un solo objeto JSON. Además, al leer un objeto de la base de datos, convierte el objeto JSON en un conjunto de archivos Map<String, String>.

Hibernate puede hacer algo similar con XML:

@JdbcTypeCode(SqlTypes.SQLXML)
private Map<String, String> properties;