LOB-gegevens in slaapstand in kaart brengen

1. Overzicht

LOB of Large OBject verwijst naar een datatype met variabele lengte voor het opslaan van grote objecten.

Het datatype heeft twee varianten:

  • CLOB - Teken Groot Object slaat grote tekstgegevens op
  • BLOB - Binair groot object is voor het opslaan van binaire gegevens zoals afbeeldingen, audio of video

In deze tutorial laten we zien hoe we Hibernate ORM kunnen gebruiken voor blijvende grote objecten.

2. Installatie

We gebruiken bijvoorbeeld Hibernate 5 en H2 Database. Daarom moeten we ze als afhankelijkheden in onze pom.xml:

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

De nieuwste versie van de afhankelijkheden bevindt zich in Maven Central Repositories.

Raadpleeg een van onze inleidende artikelen voor meer informatie over het configureren van Hibernate.

3. LOB-gegevensmodel

Ons model "Gebruiker" heeft id, naam en foto als eigenschappen. We slaan een afbeelding op in het Gebruiker'S foto-eigendom, en we zullen het toewijzen aan een BLOB:

@Entity @Table (name = "user") openbare klasse Gebruiker {@Id privé String-id; @Column (name = "name", columnDefinition = "VARCHAR (128)") private String-naam; @Lob @Column (name = "photo", columnDefinition = "BLOB") privébyte [] foto; // ...}

De @Lob annotatie specificeert dat de database de eigenschap moet opslaan als Groot object. De columnDefinition in de @Kolom annotatie definieert het kolomtype voor de eigenschap.

Omdat we gaan sparen byte-array, we gebruiken BLOB.

4. Gebruik

4.1. Start de slaapsessie

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

Met behulp van de helper-klasse zullen we het Slaap-sessie met behulp van de database-informatie die wordt verstrekt in slaapstand.eigenschappen het dossier.

4.2. Gebruikersinstantie maken

Laten we aannemen dat de gebruiker de foto uploadt als een afbeeldingsbestand:

Gebruiker gebruiker = nieuwe gebruiker (); InputStream inputStream = this.getClass () .getClassLoader () .getResourceAsStream ("profile.png"); if (inputStream == null) {fail ("Kan bronnen niet ophalen"); } user.setId ("1"); user.setName ("Gebruiker"); user.setPhoto (IOUtils.toByteArray (inputStream)); 

We converteren het afbeeldingsbestand naar de byte-array met behulp van Apache Commons IO bibliotheek, en tot slot wijzen we de byte-array toe als onderdeel van het nieuw gemaakte Gebruiker voorwerp.

4.3. Aanhoudend groot object

Door het Gebruiker de ... gebruiken Sessie, de Slaapstand converteert het object naar het databaserecord:

session.persist (gebruiker); 

Vanwege de @Lob annotatie gedeclareerd op de klas Gebruiker, Slaapstand begrijpt dat het de "foto" eigendom als BLOB data type.

4.4. Gegevensvalidatie

We halen de gegevens terug uit de database en gebruiken Slaapstand om het terug naar toe te wijzen Java object om het te vergelijken met de ingevoegde gegevens.

Omdat we de ingevoegde kennen Gebruikers id, we zullen het gebruiken om de gegevens uit de database op te halen:

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

Laten we het resultaat van de query vergelijken met de invoer Gebruiker‘S gegevens:

assertNotNull ("Resultaat van zoekopdracht is null", resultaat); assertEquals ("Gebruikersnaam is ongeldig", user.getName (), result.getName ()); assertTrue ("Foto van gebruiker is beschadigd", Arrays.equals (user.getPhoto (), result.getPhoto ())); 

Slaapstand zal de gegevens in de database toewijzen aan de Java object met dezelfde toewijzingsinformatie op de annotaties.

Daarom wordt het opgehaald Gebruiker object heeft dezelfde informatie als de ingevoegde gegevens.

5. Conclusie

LOB is datatype voor het opslaan van grote objectgegevens. Er zijn twee soorten LOB Wat genoemd wordt als BLOB en CLOB. BLOB is voor het opslaan van binaire gegevens, while CLOB is voor het opslaan van tekstgegevens.

Gebruik makend van Slaapstandhebben we laten zien hoe het vrij eenvoudig is om de gegevens van en naar in kaart te brengen Java objecten, zolang we het juiste datamodel en de juiste tabelstructuur in de database definiëren.

Zoals altijd is de code voor dit artikel beschikbaar op GitHub.