Mappage des données LOB dans Hibernate

Mappage des données LOB dans Hibernate

1. Vue d'ensemble

LOB ou Large OBject fait référence à un type de données de longueur variable pour stocker des objets volumineux.

Le type de données a deux variantes:

  • CLOB -Character Large Object stockera de grandes données texte

  • BLOB -Binary Large Object est pour stocker des données binaires telles que l'image, l'audio ou la vidéo

Dans ce didacticiel, nous allons montrer comment utiliser Hibernate ORM pour la persistance d'objets volumineux.

2. Installer

Par exemple, nous utiliserons Hibernate 5 et H2 Database. Par conséquent, nous devons les déclarer comme dépendances dans nospom.xml:


    org.hibernate
    hibernate-core
    5.2.12.Final


    com.h2database
    h2
    1.4.196

La dernière version des dépendances est enMaven Central Repositories.

Pour un examen plus approfondi de la configuration d'Hibernate, veuillez consulter l'un de nos articles surintroductory.

3. Modèle de données LOB

Notre modèle“User” a l'identifiant, le nom et la photo comme propriétés. Nous stockerons une image dans la propriété photo deUser et nous la mapperons à 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'annotation@Lob spécifie que la base de données doit stocker la propriété en tant queLarge Object. LecolumnDefinition dans l'annotation@Column définit le type de colonne de la propriété.

Puisque nous allons économiserbyte array, nous utilisonsBLOB.

4. Usage

4.1. Lancer la session Hibernate

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

En utilisant la classe helper, nous allons construire lesHibernate Session en utilisant les informations de base de données fournies dans le fichierhibernate.properties.

4.2. Créer une instance d'utilisateur

Supposons que l'utilisateur télécharge la photo en tant que fichier image:

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

Nous convertissons le fichier image dans le tableau d'octets en utilisant l'aide de la bibliothèqueApache Commons IO, et enfin, nous affectons le tableau d'octets en tant que partie de l'objetUser nouvellement créé.

4.3. Persistant grand objet

En stockant lesUser à l'aide desSession, lesHibernate convertiront l'objet en enregistrement de base de données:

session.persist(user);

En raison de l'annotation@Lob déclarée sur la classeUser,Hibernate comprend qu'elle doit stocker la propriété“photo” en tant que type de donnéesBLOB.

4.4. La validation des données

Nous récupérerons les données de la base de données et utiliseronsHibernate pour les mapper à l'objetJava afin de les comparer avec les données insérées.

Puisque nous connaissons lesUsers id insérés, nous l’utiliserons pour récupérer les données de la base de données:

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

Comparons le résultat de la requête avec les données d'entréeUser:

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 mappera les données de la base de données à l'objetJava en utilisant les mêmes informations de mappage sur les annotations.

Par conséquent, l'objetUser récupéré aura les mêmes informations que les données insérées.

5. Conclusion

LOB est un type de données pour stocker des données d'objets volumineux. Il existe deux variétés deLOB appeléesBLOB etCLOB. BLOB sert à stocker des données binaires, tandis queCLOB sert à stocker des données texte.

À l'aide deHibernate, nous avons montré à quel point il est assez facile de mapper les données vers et depuis les objetsJava, à condition que nous définissions le modèle de données correct et la structure de table appropriée dans la base de données.

Comme toujours, le code de cet article est disponibleover on GitHub.