Mapiranje LOB podataka u hibernaciji

1. Pregled

LOB ili veliki objekt odnosi se na tip podataka promjenjive duljine za pohranu velikih objekata.

Tip podataka ima dvije varijante:

  • KLOB - Znak veliki objekt pohranit će velike tekstualne podatke
  • BLOB - Binarni veliki objekt služi za pohranu binarnih podataka poput slike, zvuka ili videa

U ovom uputstvu pokazat ćemo kako Hibernate ORM možemo koristiti za uporne velike objekte.

2. Postavljanje

Na primjer, koristit ćemo Hibernate 5 i H2 bazu podataka. Stoga ih moramo proglasiti ovisnostima u našem pom.xml:

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

Najnovija verzija ovisnosti nalazi se u Maven Central Repositories.

Za detaljniji uvid u konfiguriranje hibernacije pogledajte jedan od naših uvodnih članaka.

3. LOB model podataka

Naš model "Korisnik" ima id, ime i fotografiju kao svojstva. Spremit ćemo sliku u Korisnik'S photo property, a mi ćemo ga preslikati u BLOB:

@Entity @Table (name = "user") javni razred Korisnik {@Id private String id; @Column (name = "name", columnDefinition = "VARCHAR (128)") private String name; @Lob @Column (name = "photo", columnDefinition = "BLOB") privatni bajt [] fotografija; // ...}

The @Lob napomena navodi da baza podataka treba pohraniti svojstvo kao Veliki objekt. The stupacDefinicija u @Stupac napomena definira vrstu stupca za svojstvo.

Budući da ćemo uštedjeti bajtni niz, koristimo BLOB.

4. Upotreba

4.1. Pokrenite zasjedanje hibernacije

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

Koristeći pomoćnu klasu, mi ćemo izgraditi Hibernate Sjednica koristeći podatke iz baze podataka dane u hibernirati.svojstva datoteka.

4.2. Stvaranje korisničke instance

Pretpostavimo da korisnik prenese fotografiju kao slikovnu datoteku:

Korisnik korisnik = novi korisnik (); InputStream inputStream = this.getClass () .getClassLoader () .getResourceAsStream ("profile.png"); if (inputStream == null) {fail ("Nije moguće dobiti resurse"); } user.setId ("1"); user.setName ("Korisnik"); user.setPhoto (IOUtils.toByteArray (inputStream)); 

Datoteku slike pretvaramo u bajtni niz pomoću pomoći Apache Commons IO knjižnicu, i na kraju, dodijeljujemo bajtni niz kao dio novostvorenog Korisnik objekt.

4.3. Ustrajni veliki objekt

Pohranjivanjem Korisnik koristiti Sjednica, Hibernate pretvorit će objekt u zapis baze podataka:

session.persist (korisnik); 

Zbog @Lob napomena objavljena na predavanju Korisnik, Hibernate razumije da bi trebao pohraniti "Fotografija" svojstvo kao BLOB vrsta podataka.

4.4. Provjera valjanosti podataka

Vratit ćemo podatke natrag iz baze podataka i pomoću Hibernate za mapiranje natrag u Java objekt za usporedbu s umetnutim podacima.

Budući da znamo umetnuto Korisniks id, koristit ćemo ga za dohvaćanje podataka iz baze podataka:

Korisnički rezultat = session.find (User.class, "1"); 

Usporedimo rezultat upita s ulazom KorisnikPodaci:

assertNotNull ("Rezultat upita je null", rezultat); assertEquals ("Korisničko ime je nevaljano", user.getName (), result.getName ()); assertTrue ("Korisnikova fotografija je oštećena", Arrays.equals (user.getPhoto (), result.getPhoto ())); 

Hibernate preslikava podatke iz baze podataka u Java objekt koristeći iste podatke o mapiranju na bilješkama.

Stoga preuzeto Korisnik objekt će imati iste podatke kao i umetnuti podaci.

5. Zaključak

LOB je tip podataka za pohranu podataka velikih objekata. Postoje dvije vrste LOB koji se zove BLOB i KLOB. BLOB je za pohranu binarnih podataka, dok KLOB je za pohranu tekstualnih podataka.

Koristeći Hibernate, pokazali smo kako je vrlo jednostavno mapirati podatke u i iz njih Java objekata, sve dok definiramo točan model podataka i odgovarajuću strukturu tablice u bazi podataka.

Kao i uvijek kôd za ovaj članak dostupan je na GitHub-u.