Mappatura dei dati LOB in Hibernate

1. Panoramica

LOB o Large OBject si riferisce a un tipo di dati a lunghezza variabile per la memorizzazione di oggetti di grandi dimensioni.

Il tipo di dati ha due varianti:

  • CLOB - Character Large Object memorizzerà dati di testo di grandi dimensioni
  • BLOB - Binary Large Object è per memorizzare dati binari come immagini, audio o video

In questo tutorial, mostreremo come possiamo utilizzare Hibernate ORM per persistere oggetti di grandi dimensioni.

2. Configurazione

Ad esempio, useremo Hibernate 5 e H2 Database. Quindi dobbiamo dichiararli come dipendenze nel nostro pom.xml:

 org.hibernate hibernate-core 5.4.12.Final   com.h2database h2 1.4.196 

L'ultima versione delle dipendenze si trova in Maven Central Repositories.

Per uno sguardo più approfondito alla configurazione di Hibernate, fare riferimento a uno dei nostri articoli introduttivi.

3. Modello di dati LOB

Il nostro modello "Utente" ha id, nome e foto come proprietà. Memorizzeremo un'immagine nella proprietà della foto dell'utente e la mapperemo a un BLOB:

@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 @Lob specifica che il database deve memorizzare la proprietà come Large Object . La columnDefinition nell'annotazione @Column definisce il tipo di colonna per la proprietà.

Dato che salveremo l' array di byte , stiamo usando BLOB.

4. Utilizzo

4.1. Avvia la sessione di ibernazione

session = HibernateSessionUtil .getSessionFactory("hibernate.properties") .openSession();

Utilizzando la classe helper, costruiremo la sessione Hibernate utilizzando le informazioni del database fornite nel file hibernate.properties .

4.2. Creazione di istanze utente

Supponiamo che l'utente carichi la foto come file immagine:

User user = new User(); InputStream inputStream = this.getClass() .getClassLoader() .getResourceAsStream("profile.png"); if(inputStream == null) { fail("Unable to get resources"); } user.setId("1"); user.setName("User"); user.setPhoto(IOUtils.toByteArray(inputStream)); 

Convertiamo il file immagine nell'array di byte utilizzando l'aiuto della libreria I / O di Apache Commons e, infine, assegniamo l'array di byte come parte dell'oggetto User appena creato .

4.3. Oggetto di grandi dimensioni persistente

Memorizzando l' utente utilizzando la sessione , Hibernate convertirà l'oggetto nel record del database:

session.persist(user); 

A causa dell'annotazione @Lob dichiarata sulla classe User , Hibernate capisce che dovrebbe memorizzare la proprietà "photo" come tipo di dati BLOB .

4.4. Convalida dei dati

Recupereremo i dati dal database e utilizzeremo Hibernate per mapparli di nuovo sull'oggetto Java per confrontarli con i dati inseriti.

Poiché sappiamo l'inserita User ' s id , lo useremo per recuperare i dati dal database:

User result = session.find(User.class, "1"); 

Confrontiamo il risultato della query con i dati dell'utente di input :

assertNotNull( "Query result is null", result); assertEquals( "User's name is invalid", user.getName(), result.getName() ); assertTrue( "User's photo is corrupted", Arrays.equals(user.getPhoto(), result.getPhoto()) ); 

Hibernate mapperà i dati nel database all'oggetto Java utilizzando le stesse informazioni di mappatura sulle annotazioni.

Pertanto l' oggetto Utente recuperato avrà le stesse informazioni dei dati inseriti.

5. conclusione

LOB è il tipo di dati per la memorizzazione di dati di oggetti di grandi dimensioni. Esistono due varietà di LOB chiamate BLOB e CLOB . BLOB serve per memorizzare dati binari, mentre CLOB serve per memorizzare dati di testo.

Utilizzando Hibernate , abbiamo dimostrato come sia abbastanza facile mappare i dati da e verso gli oggetti Java , purché stiamo definendo il modello di dati corretto e la struttura della tabella appropriata nel database.

Come sempre il codice per questo articolo è disponibile su GitHub.