Objektno-relaciono mapiranje podataka sa Hibernate okvirom

Branislav Gojić, Mile Živković
studenti prvog ciklusa studija Slobomir P univerzitet, Fakultet za informacione tehnologije Doboj, Bosna i Hercegovina branislav.gojic@fit.spu.ba, mile.zivkovic@fit.spu.ba
Sadržaj—U ovom radu će biti predstavljen Hibernate okvir, njegove osnovne funkcionalnosti, Hibernate Core i komponente koje se mogu koristiti uz Hibernate Core. Hibernate okvir ima bogat API, pruža mnogo mogućnosti. Orijentisan je ka programeru, tako što o mnogim zadacima ne mora da razmišlja, Hibernate okvir ih izvrsava umjesto programera, tako mu se ostavlja vremena da se bavi poslovnim problemima aplikacije. Tehnologija je vrlo sofisticirana i lagana za rad. Bitno se smanjuje vrijeme kodiranja i broj linija koda. Ključne riječi-Hibernate; JAVA; mapiranje; (key words)

Maja Živković
student drugog ciklusa studija Univerzitet u Banjoj Luci, Elektrotehnički fakultet Banja Luka, Bosna i Hercegovina mayazivkovic@hotmail.com problema i izrade domenskog modela, ili odozdo na gore, počevši od postojeće šeme baze podataka. Hibernate se tipično koristi za Swing aplikacije, Servlet bazirane aplikacije, J2EE aplikacije koje koriste EJB (Entity Java Beans). EJB 3.0 Java Persistence API(JPA) koristi Hibernate 3.0 tako da značajno smanjuje perzistentni model u EJB standardu. Hibernate okvir u sebi sadrži sljedeće interfejse: Core API koji služi za pisanje perzistentnog sloja aplikacije, Extension API kojim se vrši konfigurisanje Hibernate okvira i Metadata API koji omogućava pristup meta podacima za perzistenciju podataka. Metadata API koriste aplikacije koje moraju da konfigurišu automatizovano mapiranje podataka. Hibernate okvir koristi objektno-orijentisani upitni jezik HQL, koji po sintaksi dosta liči na SQL. U Hibernate okviru se može koristiti prirodni SQL dijalekt za bazu podataka koju aplikacija koristi. II. ZAHTEVI ZA KORIŠĆENJE HIBERNATE-A

I.

UVOD

Hibernate je proizvod kompanije JBoss (kompanija koja pripada Red Hat-u). Inače, kompanija JBoss se specijalizovala za open source rješenja srednjeg sloja (middlware) aplikacije. Svako rješenje podržava mreža programera, oni koji su učestvovali u razvoju tog rješenja i oni koji su njegovi korisnici. Hibernate je licenciran pod open source GNU Lesser General Public License (LGPL). Slobodno se može preuzeti i koristiti za razvoj aplikacija. Naravno licenca dozvoljava da se aplikacije koje koriste Hibernate slobodno distribuiraju. Hibernate je servis za objektno-relaciono perzistiranje podataka i dizajn upita. Za Hibernate okvir se može reći da je jedno od najmoćnijih i najfleksibilnijih rješenja za objektnorelaciono perzistiranje podataka, kompleksni projekat koji namjerava da postane kompletno rješenje za perzistenciju podataka u Javi. Predstavlja medijatora između aplikacije i baze podataka, a ostavlja programera da se koncentriše na poslovne procese aplikacije, dok neke procese izvršava sam alat. Rješavanje problema preslikavanja iz objektnog modela u relacioni i obratno je jako skupo. Mnogi softver inženjeri i softver arhihekti smatraju da 30% linija koda ode na rješavanje ovog problema. Hibernate okvir samostalno mapira podatke iz objektnog modela u relacioni model ili obrnuto, tako da programer ne mora da razmišlja o ovom poslu. Hibernate eliminiše ponovno i zamorno pisanje koda i ostavlja programerima vremena za rješavanje poslovnih problema. Bez obzira koju strategiju razvoja aplikacije koristimo odozgo na dole, počevši od rešavanja poslovnih

Performanse računara neophodne za korišćenje Hibernate okvira: • • • • • Hibernate 2 zahtjeva JDK(Java Dvelopment Kit) 1.2 ili višu(1.4.2 i 1.5.0 se preporučuju) Hibernate 3 zahtjeva JDK 1.3.1 ili višu(1.4.2 i 1.5.0 se preporučuju) 128 MB RAM 50 MB prostora na hard disku 400 MHz brzina procesora

Ingres. MySQL. Infomix i Firebird.0//EN" "http://hibernate. Da bi se izvršilo automatizovano objektno/relaciono mapiranje potrebno je opisati Hibernate okviru kako ti podaci treba da se transformišu iz objektnog modela u relacioni model [1]. . Session interfejs – Hibernate Session objekat predstavlja mnogo stvari u jednom. Ako aplikacija koristi neku drugu bazu podataka potrebno je ovaj fajl zamijeniti odgovarajućim. DB2. SAP DB.jar cglib. <property name="atribut n"> <column name="ADDRESS"/> </property> </class> </hibernate-mapping> Umjesto XML fajla možemo koristiti direktno anotacije u kodu. .jars c3p0. Linux i dr. • Na osnovu navedenih zahtjeva i mogućnosti može se zaključiti da Hibernate ne zahtjeva značajne performanse računara. pored Hibernate-a za rad je potrebno instalirati JDK.jar hibernate3.0. FrontBase. Jednostavno.jar ojdbc14.jar commons-logging.jar asm-attrs. Transaction interfejs – Ovaj objekat se bavi životnim vijekom transakcije.net/hibernatemapping-3. . Tako da može da čuva objekte u bazi i da ih preuzima iz baze.Sa Query objektom upit se može pisati u Hibernate orijentisanom jeziku HQL.jar <?xml version="1. MS SQL Server. Progress. Pointbase. Hibernate treba da zna u kakvoj strukturi će se čuvati objekti u bazi podataka i kako će se preuzimati iz baze. Session objekat sadrži SQL naredbe koje čekaju u redu da se sinhronizuju sa bazom podataka i mapu perzistentnih objekata kojima upravlja. Programer više nije u obavezi da svaki put iznova piše ove naredbe. Query interfejs . Ako se ne koristi transaction objekat. Interbase. Ovaj objekat ima svoj API za upravljanje perzistencijom. Unix. HypersonicSQL.• Hibernate okvir je napisan u Java programskom jeziku tako da se može izvršavati na svim operativnim sistemima na kojima se može izvršavati i Java(Windows. a može se koristiti i prirodni SQL.naziv klase" table="naziv tabele"> <id name="id" type="long" column="ID" > <generator class="increment"/> </id> <property name="atribut 1"> <column name="kolona 1" /> </property> <property name="atribut 2"> <column name="kolona 2" /> </property> . Naziv tabele ne mora biti indentičan nazivu domenske klase. Predstavlja viši nivo apstrakcije iznad JDBC-a.jar dom4j.sourceforge. Hibernate okvir podržava sledeće baze podataka i njihove SQL dijalekte: Oracle. Fajl ojdbc14.dtd"> <hibernate-mapping> <class name="domain.jar asm. Objasnit ćemo tri ključna intrfejsa iz Hibernate API-a: Session. PODEŠAVANJE HIBERNATE OKRUŽENJA I IMPLEMENTACIJA Da bi uspješno koristili hibernate okvir.jar je drajver za Oracle bazu podataka. Kada se napravi Java aplikacija pored standardnih biblioteka potrebno je dodati sljedeće: • • • • • • • • • • • antlr.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3. zatim editor u kome bi se razvijala softverska aplikacija.jar commons-collections. Koji god način koristili Hibernate ima dovoljno informacija da generiše SQL naredbe.). Rezultat koji se dobija iz baze može biti jedan objekat ili lista objekata. Transaction i Query.jar jta. PostgreSQL. Podaci o objektno-relacionom mapiranju se pišu u xml fajlovima za mapiranje i zovu se meta podaci. To je jednonitni nedjeljivi objekat koji predstavlja posebnu jedinicu posla sa bazom podataka. III. Sybase. Mckoi SQL. programeru ostaje jedino da koristi direktno JDBC.

cfg. što znači da svaka domenska klasa predstavlja jedan entitet (objekat) u sistemu.connection. ali je onda obavezno u metodi configure navesti putanju do njegovog fajla.hibernate. Ukoliko ih pronađe svi hibernate.url"> jdbc:oracle:thin:@localhost:1521:XE</property > <property name="hibernate.hbm2ddl. KONFIGURACIJA HIBERNATE OKVIRA Korišćenje Hibernate okvira započinje instanciranjem SessionFactory objekta. itd @Column(name = “ID”) – Anotacija za kolonu Anotacija se može staviti na atribut ili na geter atributa.hbm. i meta podatke za mapiranje u vidu anotacija [2].connection.username"> pos</property> <property name="hibernate.connection. koji nastaje od Configuration objekta.password"> pos</property> <property name="hibernate.configure(). Sljedi kreiranje konfiguracionog fajla za Hibernate aplikaciju.pool_size"> 100</property> <property name="show_sql">true</property> <propertyname="dialect"> org.OracleDriver</property> <property name="hibernate. SEQUENCE.cfg.IV.xml fajlu.xml u glavnom folderu projekta i baca izuzetak ukoliko ga ne nađe.net/hibernateconfiguration-3.0. Kada se pozove metoda configure().connection. Njome se povezuje entitet sa odgovarajućom tabelom u bazi. Neke od strategija su: AUTO.pool_size"> 100</property> <property name="show_sql">true</property> <property name="dialect"> org.properties u glavnom folderu projekta.dtd"> <hibernate-configuration> <session-factory> <property name="hibernate. TABLE. pored xml fajlova. Hibernate obezbeđuje. Hibernate traži fajl hibernate.dtd"> <hibernate-configuration> <session-factory> <property name="hibernate.connection. Iznad svake domenske klase se postavlja anotacija @Entity.auto">update</pro Ostaju još promene u hibernate.sourceforge.driver.0' encoding='utf-8'?> <!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD//EN" "http://hibernate. HIBERNATE ANOTACIJE Hibernate zahtjeva meta podatke koji vrše transformaciju od jedne reprezentacije podataka u drugu.hbm2ddl.driver_class"> oracle. IDENTITY. <?xml version='1. .url"> jdbc:oracle:thin:@localhost:1521:XE</property > <property name="hibernate.connection.auto"> <mapping resource="domain/mapping/warehouse.password"> pos</property> <property name="hibernate.driver_class"> oracle.dialect.connection.jdbc. Configuration objekat se pravi tako što se automatski detektuje konfiguracioni fajl.OracleDialect</property> <property name="hibernate. Tako će ovaj fajl ostati u glavnom folderu projekta nakon kompajliranja i Hibernate okvir će ga automatski naći.sourceforge.jdbc. Sljedeća anotacija koja se postavlja iznad klase je @Table(appliesTo = “naziv tabele”).xml možete postaviti i u neki drugi folder. <?xml version='1.cfg.0' encoding='utf-8'?> <!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD//EN" "http://hibernate.connection.cfg.xml i da se postavi u source direktorijum.connection. Sljede neke od anotacija za atribute domenske klase: @Id – Identifikator identiteta @Generated Value – Određuje strategiju za generisanje identifikatora.OracleDialect</property> <property name="hibernate.username"> pos</property> <property name="hibernate.OracleDriver</property> <property name="hibernate.0. SessionFactory sessionFactory = new Configuration().connection.xml"/> </session-factory> </hibernate-configuration> V.driver. Fajl hibernate. Configuration objekat se može zamisliti kao prezentacija konfiguracionog fajla za Hibernate okvir [2].buildSessionFactory( Kako program na osnovu ove linije koda zna gde je konfiguracioni fajl? Kada se pozove konstruktor new Configuraion().hibernate.hbm.net/hibernateconfiguration-3.x ml"/> resource="domain/mapping/inventorycountdoc umentitem. Preporučuje se da se konfiguracioni fajl zove hibernate.prperties fajlovi su učitani i dodati u Configuration objekat.dialect. Hibernate traži fajl hibernate.

Postoje sljedeći nivoi izolacije: • • • • • Nema izolacije – Sve je dozvoljeno. Read Commited – Neponovljivo i fantomsko čitanje je dozvoljeno. KEŠIRANJE Pristup bazi podataka je skupa operacija čak i za jednostavan upit. if (tx. Ova prevencija štiti podatke u Session keš memoriji da ne postanu nekonzistentni u odnosu na podatke iz baze. Na programeru je da proceni koji će nivo izolacije koristiti i kako će to uticati na performanse aplikacije. postavlja se putanja do klase koja u sebi ima elemente mapiranja (anotacije). transakcija se poništava. Djeljenje Session objekata između više programskih niti može da prouzrokuje gubitak podataka ili deadlock. da bi se povećao paralelizam obrade transakcija.getTransaction(). Session objekti u Hibernate nisu thread safe. Da bi se sprječili simultani pristupi podacima. može da se posmatra kao ConnectionPool koji stvara Connection objekte u JDBC-u. to može uticati na smanjenje performansi aplikacije. a druga pesimistično zaključavanje. Read Uncommited – Prljavo. [2]. Baza podataka ili drajver ne podržava transakcije. Session session = factory. dok se naredba izvršava nad podacima ili zaključavanje može trajati do završetka transakcije. VI.close(). trajno zapamćena u bazi podataka (commit) ili poništena (rollback). a SessionFactory koji kreira Session objekte. } catch (HibernateException e) { Transaction tx = session. Većina baza podataka kešira (čuva podatke u memoriji) rezultate upita ako se izvršavaju više puta. Konzistentnost (Consistency) – Transakcija ne sme da poništi pravila koja su definisana u bazi podataka. Repetable Read – Fantomsko čitanje je dozvoljeno Serializable – Pravila se moraju ispoštovati u potpunosti. try { session. svaki put kada su izvršene promjene u bazi. ažurira. a kreiranje ovog objekta oduzima dosta vremena u toku izvršavanja(runtime). Koristeći Hibernate okvir programer nije u obavezi da koristi Transaction interfejs. Ako iz nekog razloga transakcija poništi pravila baze podataka. Dat je primjer koda. Transakcija predstavlja jedno izvršenje neke “logičke jedinice posla” korisnika baze podataka. dozvoljavaju kršenje ovih osobina u većoj ili manjoj mjeri [3]. Još ako podaci trebaju proći preko mreže. VIII. jednom SUBP se dozvoljavaju različiti nivoi izolativnosti podataka. Ukoliko je u pitanju select upit podaci se opet trebaju vratiti do klijentskog sloja. Preporučuje se da se kreira više Session objekata. Session objekat predstavlja centralnu tačku u pristupu Hibernate funkcionalnostima. TRANSAKCIJE I ZAKLJUČAVANJE Transakcija i zaključavanje objekata u bazi su dvije operacije koje su usko povezane. Tehnike zaključavanja omogućuju uspešnost transakcije. } Baza podataka može da obezbedi različite nivoe izolacije. Poništavaju se sve operacije(naredbe) koje su se izvršile (deo transakcije koji se izvršio – rollback). Međutim ukoliko su ove osobine u potpunosti ispunjene. } finally { session. neponovljivo i fantomsko čitanje je dozvoljeno.Možete primetiti da umesto putanje do XML fajlova za mapiranje. baza sama zaključava podatke.getTransaction(). Tako se smanjuje . // Kod gde se manipuliše sa Session objektom session. postojeće objekte u bazi. Idealno bi bilo kada bi za jednu bazu podataka bio napravljen samo jedan SessionFactory objekat.openSession(). SessionFactory je veoma skup objekat. da briše objekat iz baze i da čita objekte iz baze [1]. Takođe pošto je SessionFactory thread-safe. Session objekat služi da kreira nove objekte u bazi. Zato proizvođači baza podataka. potrebno ga je uništiti i napraviti novi objekat. Session objekat može da se posmatra kao JDBC konekcija. Zaključavanje može biti momentalno.rollback(). Ukoliko Hibernate Session objekat baci izuzetak bilo koje vrste. Baza podataka mora da kompajlira SQL upitni jeziku jezik razumljiv bazi podataka. Izolacija (Isolation) – Efekti transakcije ne mogu biti vidljivi drugim transakcijama dok se ona ne izvrši uspešno. Međutim. Zahtev često mora biti poslat preko mreže do servera.beginTransaction() i tek onda manipulisati transakcijom. Trajnost (Durability) – Kada su neke promene potvrđene u bazi one se ne mogu više izgubiti.beginTransaction(). U zavisnosti od toga kakva je transakcija zavisi i koji će se podaci zaključati. SESSION OBJEKAT Teorijiski transakcija mora da ima sledeće osobine (ACID osobine): Autonomnost (Automicity) .commit(). onda se ona poništava. Da bi ovo postigli moramo prvo započeti transakciju session. ali zato bi morao da koristi flush() metod nad Session objektom. to je još jedan razlog da se objekat instancira samo jednom i da sve niti u aplikaciji koriste taj objekat. Prva vrsta zaključavanja se zove optimistično.Transakcija je sve ili ništa.isActive()) tx. njegovo dupliranje (ili instanciranje više puta) može da prouzrokuje probleme veoma brzo. VII. Tako se brzo vraća u prethodno stanje. Transakcija može biti startovana. Ukoliko se ne izvrše sve aktivnosti i operacije nad bazom. Posmatrajući JDBC pristup. za svaku programsku nit po jedan. to znatno usporava rad aplikacije.

alter column. protected ili public. Da bi izbjegli dupliranje validacija na svakom sloju. HQL radi sa perzistentnim objektima i njihovim atributima. L1 keš za isti zahtjev vraća response iz keša ( objekte koji su u kešu. delete ). najbolje je otkriti testiranjem aplikacije. itd). Kada se koriste ograničenja na nivou polja. Tip pristupa može bit private. . update. Obavezan L1 keš kroz koji zahtjevi moraju proći i opcioni L2 keš. koji se odnose na jedan request objekat koristi se evict() metod. HQL upiti se prevode u SQL upite. Definiše model meta podataka i API za validaciju objekta. Slika 1. Često je ista logika za validaciju implementirana na svim slojevima. Validacija po slojevima [HibernateValidation] JSR-303(Java Specification Request) – predstavlja validaciju objekta (bean validation). a još bolje ponašanjem aplikacije u produkciji. Moramo znati da ne mogu sva ograničenja da se postave za svaki nivo. X. IX. Fajlovi za gramatiku se nalaze u folderu za gramatiku u Hibernate Core. pristupa se vrednosti tog polja i proverava se da li je ona u skladu sa ograničenjem. ANTLR je alat za pravljenje parsera za jezike. DEFINISANJE OGRANIČENJA Objekat u Java aplikaciji je validan. Anotacije su podrazumevani izvor meta podataka. Razlikujemo tri vrste ograničenja: nivo metode i nivo klase. a Hibernate okvir ima mogućnost da direktno koristi SQL upite. ne ide se do baze. Hibernate validator je implementacija JSR-303. ako imamo u vidu da imamo više klijenata koji prave različite zahtjeve. drugi nivo keširanja je opcioni i može da se konfiguriše. Međutim. Ograničenja u validaciji objekta se opisuju kroz java anotacije. ako je u skladu sa svim ograničenjima koja se odnose na taj objekat. XI. Slika 2. Da bi se izbrisali objekti iz keša. API nije vezan za specifičan sloj aplikacije. ali pored operacije nad tabelama i kolonama. Anotacije imaju mogućnost da preklope i naslede meta podatke kroz korišćenje XML-a. HQL je jezik sa svojom sintaksom i gramatikom. Sličan je SQL-u. L1 keš će uvijek biti kontaktiran pe nego što se kontaktira keš L2. Tako domenske klase predstavljaju klase sa meta podacima za validaciju podataka. Da bi se u potpunosti ispraznio keš koristi se clear() metod. HQL-om se mogu dobijati podaci iz baze (select naredba ) ili se mogu ažurirati podaci u bazi (inset. JDBC ne obezbjeđuje keširanje direktno. programeri često celu validacionu logiku ubace u domenski model. kako on validira ograničenja opisana u anotacijama u domenskom modelu. HQL sintaksa je definisana ANTLR [2] gramatikom. HIBERNATE UPITNI JEZIK Slika 3.vrijeme komunikacije sa diskom (gdje su podaci) i kompajliranja upita. HQL je mnogo kompaktniji jezik od SQL jer koristi informacije definisane u Hibernate mapiranju. Koliko je opcioni keš potraban. Tako ga može koristiti više aplikacija ili više distribuiranih aplikacija. HIBERNATE VALIDACIJA Validacija podataka je obavezna za svaku aplikaciju. Static polja i metode ne mogu biti validirane. a odnose se na taj zahtjev). to nije velika ušteda vremena. Podjednako je dostupan i za serversku i za klijentsku stranu aplikacije. Hibernate obezbjeđuje prvi nivo keširanja( L1 keš) kroz koji prolaze svi zahtjevi. Veza između Session objekta i dva keša L2 se nalazi eksterno van Hibernate okvira. tako se smanjuje broj grešaka i manje je vrijeme za implementaciju. U ovom dijelu ćemo objasniti kako se koristi Hibernate validator tj. Bitna je kako prezentacioni sloj tako i za perzistentni sloj. HQL se preporučuje kada je god to moguće kako bi se izbjegli problemi sa portabilnošću SQL-a sa bazom podataka. Validacija se postavlja tako što se postavi anotacija iznad polja. Na slici možemo vidjeti dva keša koji su dostupni Session objektu. i koji treba izabrati. HQL-om se ne može promjeniti struktura baze (alter table. Validacija u domenskom modelu [HibernateValidation] Hibernate Query Language ( u daljem tekstu HQL) je objektno orijentisan upitni jezik. L1 keš je definitivno prednost Hibernate okvira u odnosu na JDBC.

validacija će se bespotrebno vršiti dvaput. XIII. 2009 . so what about the many does not have to think. ne može se koristiti setter. Preporuka je koji god se metod koristi (polja ili metode) da se koristi jedan ili drugi jer ako budemo imali dvije anotacije. Hibernate framework has a rich API. NASLEĐIVANJE OGRANIČENJA Set je prazan ukoliko je validacija uspjela. dr. Kada se ograničenje postavi na nivo klase onda se svaki objekat te klase validira u skladu sa ograničenjima klase. U suprotnom za svako prekršeno ograničenje je dodat ConstraintViolation objekat. ValidationFactory se dobija preko statičke metode Validation. XII.getValidator(). pod mentorstvom prof. 2007. It reduces coding time and number of lines of code. VALIDACIJA OGRANIČENJA OBJEKTA Validator interfejs je glavna ulazna tačka za validaciju objekta. This document will be presented to the Hibernate framework. Validator interfejs ima tri metode koje mogu da se koriste bilo za validaciju cjelog objekta ili za validaciju jednog atributa u objektu. Sve tri metode vraćaju Set<ConstraintViolation>.buildDefaultValidationFactory(). 2006. Validator objekat se dobija od ValidatorFactory objekta. LITERATURA [1] [2] [3] Christian Bauer. The technology is very sophisticated and easy to operate . so he leaves time to deal with the problems of business applications. Apress. its basic functionality of Hibernate Core and components thet can be used with the Hibernate Core. Jeff Linwood: Begining Hibernate. ABSTRACT Kada se validira objekat koji implentira interfejs ili nasleđuje klasu. Dave Minter. Ilija Antović: Objektno-relaciono mapiranje i primjena korišćenjem Hibernate okvira. ZAHVALNICA Istraživanja u ovom radu rađena su u sklopu projektnog rada iz predmeta “Nove softverske tehnologije “ na prvom ciklusu studija na fakultetu za informacione tehnologije. Siniše Vlajića. Oriented to the programmer. it gets the Hibernate framework rather than programmers. Gaving King: Java Persistence with Hibernate. Ograničenje može biti postavljeno i na nivo klase. Metoda validate() proverava sva ograničenja prosleđenog objekta. Slobomir P Univerziteta.buildDefaultValidatorFactory(). Validator validator = factory. Sledi primer koda ValidatorFactory factory = Validation. PAPER TITLEOBJECT-RELATIONAL MAPPING DATA WITH THE HIBERNATE FRAMEWORK Gojić Branislav Mile Živković Maja Živković . validiraju se ne samo njegova ograničenja. provides many opportunities.Umesto polja može se anotirati njen getter. već i ograničenja koja implementira njegov interfejs ili ograničenja roditeljske klase.

Sign up to vote on this title
UsefulNot useful