6.1 Archiviare i file sul server

A volte gli oggetti binari devono essere salvati nel database. Ad esempio, file. Se il file è di grandi dimensioni, è più ragionevole archiviarlo in una cartella separata sul disco e archiviarne i percorsi nel database. Esempio:

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

E nel database memorizziamo solo un percorso relativo al file:

\12355\avatar.jpg

È conveniente memorizzare un percorso relativo nel database, poiché è quindi facile ottenere un URL da esso:

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

Incolliamo semplicemente il percorso relativo al nome del server e il gioco è fatto.

6.2 Archiviare le immagini direttamente nel database

Tuttavia, se le immagini sono piccole, possono essere memorizzate direttamente nel database e fornite al client come set di byte. Per questi casi, SQL ha uno speciale tipo di dati BLOB : Binary Large Object. O meglio, ce ne sono addirittura due:

  • CLOB - Personaggio Grande Oggetto,
  • BLOB - Grande oggetto binario.

CLOB è utilizzato per memorizzare testi molto grandi. Un BLOB serve per memorizzare dati binari, come piccole immagini, video e simili.

Esempio:

@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'annotazione @Lobdice a Hibernate che un Large Object è memorizzato nel campo . E columnDefinition="BLOB"parla già di come salvare tutto nel database.

Scriviamo un codice di esempio che salva un nuovo utente e la sua foto nel database:

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.3XML e JSON

Hibernate ha un supporto interessante per JSON come tipo di dati. Ti consente di memorizzare una HashMap di stringhe come un singolo oggetto JSON. Se il DBMS può funzionare con JSON, allora avrà questo aspetto:

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

Hibernate si occupa che l'oggetto type Map<String, String>sia serializzato in un singolo oggetto JSON. Inoltre, durante la lettura di un oggetto dal database, trasforma l'oggetto JSON in un insieme di file Map<String, String>.

Hibernate può fare qualcosa di simile con XML:

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