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 Korisnik‘s 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.