Zuordnen von LOB-Daten im Ruhezustand

1. Übersicht

LOB oder Large OBject bezieht sich auf einen Datentyp variabler Länge zum Speichern großer Objekte.

Der Datentyp hat zwei Varianten:

  • CLOB - Character Large Object speichert große Textdaten
  • BLOB - Binary Large Object dient zum Speichern von Binärdaten wie Bild, Audio oder Video

In diesem Tutorial zeigen wir, wie wir Hibernate ORM zum Speichern großer Objekte verwenden können.

2. Setup

Zum Beispiel werden wir Hibernate 5 und H2 Database verwenden. Deshalb müssen wir sie in unserer pom.xml als Abhängigkeiten deklarieren :

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

Die neueste Version der Abhängigkeiten befindet sich in Maven Central Repositories.

Weitere Informationen zur Konfiguration von Hibernate finden Sie in einem unserer Einführungsartikel.

3. LOB-Datenmodell

Unser Modell "Benutzer" hat ID, Name und Foto als Eigenschaften. Wir speichern ein Bild in der Fotoeigenschaft des Benutzers und ordnen es einem BLOB zu:

@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; // ... }

Die Annotation @Lob gibt an, dass die Datenbank die Eigenschaft als großes Objekt speichern soll . Die columnDefinition in der Annotation @Column definiert den Spaltentyp für die Eigenschaft.

Da wir das Byte-Array speichern , verwenden wir BLOB.

4. Verwendung

4.1. Sitzung im Ruhezustand einleiten

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

Unter Verwendung der Hilfsklasse, werden wir die bauen Hibernate Session die Datenbankinformationen in bereitgestellt mit hibernate.properties Datei.

4.2. Benutzerinstanz erstellen

Angenommen, der Benutzer lädt das Foto als Bilddatei hoch:

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

Wir konvertieren die Bilddatei mithilfe der Apache Commons IO- Bibliothek in das Byte-Array und weisen das Byte-Array schließlich als Teil des neu erstellten Benutzerobjekts zu .

4.3. Anhaltendes großes Objekt

Durch die Speicherung von Benutzern der Verwendung von Session , die Hibernate wird das Objekt in den Datensatz der Datenbank konvertieren:

session.persist(user); 

Wegen der @Lob Anmerkung auf die Klasse deklariert Benutzer , Hibernate versteht es sollte die speichern „Foto“ Eigenschaft als BLOB - Datentyp.

4.4. Datenvalidierung

Wir werden die Daten aus der Datenbank zurückholen und sie im Ruhezustand wieder dem Java- Objekt zuordnen, um sie mit den eingefügten Daten zu vergleichen.

Da wir die eingefügt wissen Benutzer ' s - ID , werden wir es verwenden , um die Daten aus der Datenbank abgerufen werden :

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

Vergleichen wir das Ergebnis der Abfrage mit den Daten des eingegebenen Benutzers :

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

Der Ruhezustand ordnet die Daten in der Datenbank dem Java- Objekt zu, wobei dieselben Zuordnungsinformationen in den Anmerkungen verwendet werden.

Daher hat das abgerufene Benutzerobjekt dieselben Informationen wie die eingefügten Daten.

5. Schlussfolgerung

LOB ist ein Datentyp zum Speichern großer Objektdaten. Es gibt zwei Arten von LOB, die als BLOB und CLOB bezeichnet werden . BLOB dient zum Speichern von Binärdaten, während CLOB zum Speichern von Textdaten dient.

Mit Hibernate haben wir gezeigt, wie einfach es ist, Daten auf und von Java- Objekten abzubilden , solange wir das richtige Datenmodell und die entsprechende Tabellenstruktur in der Datenbank definieren.

Wie immer ist der Code für diesen Artikel auf GitHub verfügbar.