6.1 Stocker des fichiers sur le serveur

Parfois, les objets binaires doivent être enregistrés dans la base de données. Par exemple, les fichiers. Si le fichier est volumineux, il est plus raisonnable de le stocker dans un dossier séparé sur le disque et de stocker ses chemins dans la base de données. Exemple:

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

Et dans la base de données, nous stockons juste un chemin relatif vers le fichier :

\12355\avatar.jpg

Il est pratique de stocker un chemin relatif dans la base de données, car il est alors facile d'en obtenir une URL :

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

Nous collons simplement le chemin relatif au nom du serveur et nous avons terminé.

6.2 Stocker les images directement dans la base de données

Cependant, si les images sont petites, elles peuvent être stockées directement dans la base de données et transmises au client sous la forme d'un ensemble d'octets. Dans de tels cas, SQL a un type de données BLOB spécial - Binary Large Object. Ou plutôt, il y en a même deux :

  • CLOB - Grand objet de caractère,
  • BLOB - Grand objet binaire.

CLOB est utilisé pour stocker des textes très volumineux. Un BLOB sert à stocker des données binaires, telles que de petites images, des vidéos, etc.

Exemple:

@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;

	// ...
}

L'annotation @Lobindique à Hibernate qu'un grand objet est stocké dans le champ . Et columnDefinition="BLOB"parle déjà de la façon de tout enregistrer dans la base de données.

Écrivons un exemple de code qui enregistre un nouvel utilisateur et sa photo dans la base de données :

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 et JSON

Hibernate a un support intéressant pour JSON en tant que type de données. Il vous permet de stocker un HashMap de chaînes sous la forme d'un seul objet JSON. Si le SGBD peut fonctionner avec JSON, cela ressemble à ceci :

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

Hibernate veille à ce que l'objet type Map<String, String>soit sérialisé en un seul objet JSON. De plus, lors de la lecture d'un objet à partir de la base de données, il transforme l'objet JSON en un ensemble de fichiers Map<String, String>.

Hibernate peut faire quelque chose de similaire avec XML :

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