LOB-Daten im Ruhezustand zuordnen

LOB-Daten im Ruhezustand zuordnen

1. Überblick

LOB oder Large OBject bezieht sich auf einen Datentyp mit 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. Konfiguration

Beispielsweise verwenden wir die Hibernate 5- und H2-Datenbank. Daher müssen wir sie als Abhängigkeiten in unserenpom.xml: deklarieren


    org.hibernate
    hibernate-core
    5.2.12.Final


    com.h2database
    h2
    1.4.196

Die neueste Version der Abhängigkeiten ist inMaven Central Repositories.

Weitere Informationen zum Konfigurieren des Ruhezustands finden Sie in einem unserer Artikel zuintroductory.

3. LOB-Datenmodell

Unser Modell“User” hat ID, Name und Foto als Eigenschaften. Wir speichern ein Bild in der Foto-Eigenschaft vonUserund 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 alsLarge Object speichern soll. DascolumnDefinition in der Annotation@Column definiert den Spaltentyp für die Eigenschaft.

Da wirbyte array sparen, verwenden wirBLOB.

4. Verwendungszweck

4.1. Ruhezustand einleiten

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

Mit der Hilfsklasse erstellen wir dieHibernate Session unter Verwendung der Datenbankinformationen, die in der Dateihibernate.properties enthalten sind.

4.2. Benutzerinstanz erstellen

Nehmen wir an, 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 Bibliothek vonApache Commons IOin das Byte-Array und weisen das Byte-Array schließlich als Teil des neu erstelltenUser-Objekts zu.

4.3. Anhaltendes großes Objekt

Durch Speichern derUser unter Verwendung derSession konvertieren dieHibernate das Objekt in den Datenbankdatensatz:

session.persist(user);

Aufgrund der in der KlasseUser deklarierten Annotation@Lob verstehtHibernate, dass die Eigenschaft“photo”als DatentypBLOBgespeichert werden sollte.

4.4. Datenvalidierung

Wir rufen die Daten aus der Datenbank zurück und ordnen sie mitHibernate wieder dem Objekt vonJavazu, um sie mit den eingefügten Daten zu vergleichen.

Da wir die eingefügtenUser 's id kennen, werden wir sie verwenden, um die Daten aus der Datenbank abzurufen:

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

Vergleichen wir das Ergebnis der Abfrage mit den Daten der EingabeUser:

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 ordnet die Daten in der Datenbank demJava-Objekt zu, wobei dieselben Zuordnungsinformationen in den Anmerkungen verwendet werden.

Daher hat das abgerufeneUser-Objekt die gleichen Informationen wie die eingefügten Daten.

5. Fazit

LOB ist ein Datentyp zum Speichern großer Objektdaten. Es gibt zwei Sorten vonLOB, die alsBLOB undCLOB bezeichnet werden. BLOB dient zum Speichern von Binärdaten, währendCLOB zum Speichern von Textdaten dient.

MitHibernate haben wir gezeigt, wie einfach es ist, die Daten auf und vonJava Objekten abzubilden, solange wir das richtige Datenmodell und die entsprechende Tabellenstruktur in der Datenbank definieren.

Wie immer ist der Code für diesen Artikelover on GitHub. verfügbar