Kortlægning af LOB-data i dvale
1. Oversigt
LOB eller Large OBject henviser til en datatype med variabel længde til lagring af store objekter.
Datatypen har to varianter:
- CLOB - Karakter stort objekt gemmer store tekstdata
- BLOB - Binært stort objekt er til lagring af binære data som billede, lyd eller video
I denne vejledning viser vi, hvordan vi kan bruge Hibernate ORM til vedvarende store objekter.
2. Opsætning
For eksempel bruger vi Hibernate 5 og H2 Database. Derfor må vi erklære dem som afhængigheder i vores pom.xml:
org.hibernate hibernate-core 5.4.12.Finale com.h2database h2 1.4.196
Den seneste version af afhængighederne findes i Maven Central Repositories.
For et mere dybtgående kig på konfiguration af dvale henvises til en af vores indledende artikler.
3. LOB-datamodel
Vores model "Bruger" har id, navn og foto som egenskaber. Vi gemmer et billede i Bruger'S fotoejendom, og vi kortlægger den til en BLOB:
@Entity @Table (navn = "bruger") offentlig klasse bruger {@Id privat streng-id; @Column (name = "name", columnDefinition = "VARCHAR (128)") privat strengnavn; @Lob @Column (name = "photo", columnDefinition = "BLOB") privat byte [] foto; // ...}
Det @Lob annotation angiver, at databasen skal gemme ejendommen som Stort objekt. Det columnDefinition i @Kolonne annotation definerer kolonnetypen for ejendommen.
Da vi skal spare byte-array, vi bruger BLOB.
4. Anvendelse
4.1. Start dvale-session
session = HibernateSessionUtil .getSessionFactory ("hibernate.properties") .openSession ();
Ved hjælp af hjælperklassen vil vi opbygge Dvalesession ved hjælp af databaseoplysningerne i dvale.egenskaber fil.
4.2. Oprettelse af brugerinstans
Lad os antage, at brugeren uploader billedet som en billedfil:
Brugerbruger = ny bruger (); InputStream inputStream = this.getClass () .getClassLoader () .getResourceAsStream ("profile.png"); hvis (inputStream == null) {fail ("Kan ikke hente ressourcer"); } user.setId ("1"); user.setName ("Bruger"); user.setPhoto (IOUtils.toByteArray (inputStream));
Vi konverterer billedfilen til byte-array ved hjælp af Apache Commons IO bibliotek, og til sidst tildeler vi byte-arrayet som en del af det nyoprettede Bruger objekt.
4.3. Vedvarende stort objekt
Ved at opbevare Bruger bruger Session, det Dvale konverterer objektet til databaseposten:
session.persist (bruger);
På grund af @Lob kommentar erklæret på klassen Bruger, Dvale forstår, at det skal gemme "Foto" ejendom som BLOB datatype.
4.4. Data validering
Vi henter dataene tilbage fra databasen og bruger dem Dvale at kortlægge det tilbage til Java modsætter sig at sammenligne det med de indsatte data.
Da vi kender det indsatte Bruger‘s id, vi bruger det til at hente dataene fra databasen:
Brugerresultat = session.find (User.class, "1");
Lad os sammenligne forespørgslens resultat med input Bruger'S data:
assertNotNull ("Forespørgselsresultat er null", resultat); assertEquals ("Brugerens navn er ugyldigt", user.getName (), result.getName ()); assertTrue ("Brugerens foto er beskadiget", Arrays.equals (user.getPhoto (), result.getPhoto ()));
Dvale vil kortlægge dataene i databasen til Java objekt ved hjælp af de samme kortoplysninger på kommentarerne.
Derfor hentet Bruger objektet vil have de samme oplysninger som de indsatte data.
5. Konklusion
LOB er datatype til lagring af store objektdata. Der er to varianter af LOB som kaldes BLOB og CLOB. BLOB er til lagring af binære data, mens CLOB er til lagring af tekstdata.
Ved brug af Dvale, vi har demonstreret, hvordan det er ret nemt at kortlægge dataene til og fra Java objekter, så længe vi definerer den korrekte datamodel og den relevante tabelstruktur i databasen.
Som altid er koden til denne artikel tilgængelig på GitHub.