Utilizarea Framework Ului Hibernate Pentru Elaborarea Aplicatiilor Web
UTILIZAREA FRAMEWORK-ULUI HIBERNATE PENTRU
ELABORAREA APLICAȚIILOR WEB
526.2 TEHNOLOGII INFORMAȚIONALE
Teză de licență
Cuprins
Introducere
Tendința omenirii de a imita, reproduce, multiplica și eterniza diverse obiecte, procese și fenomene a apărut cînd ea a conștientizat locul său în lumea înconjurătoare. Odată cu dezvoltarea științei și perfecționarea mijloacelor de calcul se schimbă esențial metodele și procedeele de soluționare a problemelor. Utilizarea performanțelor calculatoarelor moderne implică pătrunderea amplă a metodelor în cele mai diverse domenii. Aceste premise conduc la creșterea complexității problemelor și diversificarea claselor de probleme rezolvabile cu ajutorul noilor tehnologii.
Epoca modernă se caracterizează prin marea dezvoltare pe care o au tehnologiile informaționale. În epoca actuală, dezvoltarea aplicațiilor se caracterizează prin utilizarea celor mai noi și simple în folosire tehnologii care au apărut în ultimii ani în urma cerințelor comerciale, sociale sau economice. În practica cotidiană foarte des operăm cu date ce țin de anumite subiecte. Utilizarea eficientă a acestor date generează problema organizării, stocării, regăsirii și modificării lor. Lucrurile se complică în cazul gestionării unor date cu caracter complex, cum ar fi evidența contabilă, evidența contbilelor și retribuirea muncii lor, activitatea financiară a unei unități economice etc. În aceste situații este oportună utilizarea bazelor de date.
Object / Relational Mapping este o nouă tehnică de programare și ajută ca accesarea și manipularea obiectelor să se facă cît mai ușor, programatorul ne fiind interesant de sursa de date (baza de date) de unde provin obiectele cu care ei lucrează. ORM trebuie să ne creeze o relație naturală, transparentă sau fiabilă și de durată între două modele. Această tehnologie Object/Relational Mapping încă nu este agreată de toți dezvoltatorii de aplicații, însă putem să spunem ferm că framework-urile care fac parte din ORM duc dezvoltarea de aplicații cu un pas înainte.
În urma dezvoltării aplicațiilor care interacționează cu baza de date relaționale, a fost creată o tehnologie de programare nouă care lucrează cu tabele din baza de date la nivel de obiecte. Această tehnologie se numește Object-relational mapping (ORM) și este foarte des aplicată în dezvoltarea aplicațiilor pentru întreprinderi. Multe aplicații sunt scrise pe baza a OOP, dar pastrează datele în tabele relaționale anumite, și ORM se folosește pentru a se poate manipula mai ușor și comod cu baze de date relaționale ca Oracle, DB2, Sybase, MongoDB, SQLite și alte RDBMS.
Utilizarea pe larg de către firmele de programare a framework-urilor bazate pe tehnologia ORM în dezvoltarea aplicațiilor m-a făcut să aleg cercetarea și studierea acestei tehnologii. Un alt argument în alegerea temei date este că această temă este foarte actuală, are mai multe avantaje decît dezavantaje în urma folosirii acestei care vor fi descrise pe larg în continuare.
Capitolul I, este descrisă pe scurt tehnologia Java, ea fiind una din principalele tehnologii care există în momentul de față, noțiuni generale despre Sistemele de gestiune a bazelor de date, conceptul, structura și arhitectura sa. Un alt punct din acest capitol este MySQL, definiții generale, date despre MySQL. Și în sfîrșit ultimul punct din capitolul dat este descrisă succint tehnologia Object/ Relational Mapping (ORM) definiție, ce este ORM și avantajele tehnologiei date.
Capitolul II, conține descrierea la un șir de instrumente folosite la elaborarea aplicației. Cel mai important punct din acest capitol fiind descrierea pe scurt a framework-ului Hibernate care ne demonstrează în practică toate abilitățile tehnologiei Object / Relational Mapping. Un alt punct din acest capitol reprezintă caracteristicile,avantajele tehnologiei JSF și IDE-ul Spring Tools Suite care ne ajută la crearea aplicațiilor.
Capitolul III, reprezintă descrierea pe larg a aplicației dezvoltate, și anume, ce pagini conține, cum este structurată aplicația, care sunt avantajele folosirii, ce ne permite și pentru ce a fost creată.
Structurat în 3 capitole, lucrarea dată are ca obiectiv prezentarea succintă, clară și suficient exemplificată a noțiunilor de bază ale bazelor de date și tehnologiei Object- relational mapping, precum și obținerea cunoștințelor generale vizînd conceptele de bază a framework-ului Hibernate și a deprinderilor vizînd maparea unei clase, crearea interfenței și crearea funcțiilor de lucru cu datele din tabelele bazei de date.
Capitolul I
Limbajul de programare Java
Ce este Java ?
Java este o tehnologie nouă și inovatoare care a fost lansată de compania Sun Microsystems în anul 1995, și a avut un mare impact asupra întregului grup de dezvoltatori de software din lume, s-a impus rapid deoarece are calități deosebite una dintre ele fiind simplitatea limbajului, și una din caracteristicile de baza care este portabilitatea. Inițial a fost denumită OAK, Java este formată dintr-un limbaj de programare de nivel înalt pe care se bazează o serie mare de platforme care sunt destinate implementării de aplicații pentru toate segmentele industriei de software.
Limbajul de programare Java
Caracteristicile de bază ale limbajului Java:
Simplitate – elimină moștenirea multiplă, supraîncărcarea operatorilor, tot ce poate provoca scrierea unui cod confuz.
Ușurință- crearea aplicațiilor complexe este destul de ușoară.
Robustețe – elimină erorile frecvente ce pot apar în programare, adică prin renunțarea la pointeri, administrarea automată a memoriei, eliminarea pierderilor de memorie printr-o procedură de colectare a obiectelor, cu ajutorul tehnologiei care lucrează în fundal și se numește ”garbage collector”.
Complet orientat pe obiecte – elimină complet stilul de programare procedural.
Securitate – limbaj de programare foarte sigur, verifică dinamic codul pentru detectarea de secvențe periculoase, impunerea unor reguli stricte pentru rularea proceselor la distanță, etc.
Neutralitate arhitecturală – este un limbaj portabil și poate rula cu aceiași ușurință pe toate sistemele de operare.
Portabililtate – este independent de platforma de lucru, aceeași aplicație poate rula fără schimbări și fără a necesitarea recompilării ei pe SO diferite cum ar fi Windows, Linux,Mac OS, Solaris, etc. lucru care aduce economii substanțiale firmelor care dezvoltată aplicații.
Este compilat și interpretat.
Performanță – deși pierde din viteza de lucru în comparație cu limbaje ca C++, PHP ș.a.m.d, compilatorul Java asigură o performanță ridicată a codului, încît viteza de lucru puțin mai scăzută nu va fi un impediment în dezvoltarea de aplicații oricît de complexe.
Este modelat după limbajele de programare C și C++, trecerea la Java se face destul de ușor.
Crearea obiectelor în Java
In Java, un obiect este o instanță a unei clase:
Declararea obiectelor în Java
Orice obiect trebuie sa aibă tipul unei clase sau chiar a unei interfațe:
NumeClasa <nume>;
Instanțierea obiectelor în Java
Instanțierea unui obiect în Java se face cu operatorului new, la crearea obiectului i se acordă memorie.
<nume> = new NumeClasa();
Inițializarea în Java
Pentru a inițializa un obiect avem nevoie de constructorul clasei, după ce se instanțiază obiectul cu new se alocă memorie, deodată se apelează constructorul clasei, cu sau fară parametri.
<nume> = new NumeClasa([arg1, arg2…arg n]);
Crearea claselor în Java
Clasele reprezintă o modalitate de a introduce noi tipuri abstracte de date într-o aplicație Java, iar cea de a doua posibilitate este cu ajutorul interfețelor. Declararea unei clase are următoarea formă generală:
[public][abstract][final]class NumeClasa
[extends NumeSuperclasa]
[implements Interfata1 [, Interfata2 … ]]
{
//constructorul clasei
public NumeClasa(){
}
// Corpul clasei
}
O clasă poate avea un șir de modificatori:
Public – clasa declarată cu modificatorul public poate fi chemată și instanțiată in orice parte a codului a unui proiect, este vizibilă de toate celelalte clase.
Abstract – este o clasă abstractă sau șablon. Clasa abstractă nu poate fi instanțiată(nu poate avea obiecte de tipul clasei), se folosește pentru a crea un model, șablon comun pentru o serie de subclase care o moștenesc.
Final – o clasă care se declară ca final niciodata nu va putea fi moștenită.
Pentru ca o anumită clasă să poata moșteni o altă clasă mai superioare se folosește cuvintul-cheie extends, în Java o clasă nu poate moșteni mai multe clase, deci Java nu suportă moștenirea multiplă însă o clasă poate moșteni mai multe interfețe care sunt reparate prin virgulă și se moștenesc cu ajutorul cuvintului-cheie implements. Spre deosebire de alte limbaje de programare orientate-obiect, Java permite doar moștenirea simplă, ceea ce îneamnă că o clasă poate avea un singur părinte
(superclasă). Dar, o clasă poate avea o mulțime de moștenitori (subclase), deci putem sa spunem ca mulțimea de clase în Java se reprezintă ca un arbore, iar rădăcina acestuia arbore este clasa principală Object. Deci, Object nu are părinte, fiind foarte importantă în modul de lucru cu obiecte si structuri de date în Java. Moștenirea unei clase:
class B extends A {…}
// A este superclasa clasei B
// B este o subclasa a clasei A
O subclasă moștenește toate variabilele de la părintele său și toate metodele care nu au modificatorul private.
Corpul unei clase urmează imediat după declararea clasei și este cuprins între acolade. Conținutul corpului unei clase este format din:
Declararea, inițializarea variabilelor pe care le are o clasă.
Declararea și implementarea constructorilor, o clasă poate să conțină mai mulți constructori cu sau fără parametri.
Declararea și implementarea metodelor.
Declararea unor clase imbricate (interne) dacă este nevoie.
Constructorii unei clase sunt ca niște metode și au tipul clasei în care sunt descriși, returnează void și cel mai des sunt folosiți pentru a crea noi obiecte ale clasei cu anumiți parametri sau fără.
public class A {
// Constructor
[modificatori] A([arg1, arg2….arg n]) {
}
}
O clasă din Java poate avea mai mulți constructori însă parametrii trebuie să fie diferiți,deci ne putem permite inițializarea,crearea de noi obiecte cu parametri diferiți. Constructorul unei clase se cheamă automat la crearea unui obiect al unei clase. Dacă nu vom avea nici un constructor declarat în clasă atunci se va crea un constructor implicit fără parametri și care nu va face nimic atîta timp cît nu va fi apelat, deci o clasă poate să nu aibă nici un constructor deoarece nu e obligatoriu. Însă dacă dezvoltatorul în interiorul unei clase va declara un constructor cu parametru atunci, sistema nu va mai crea constructorul implicit.
Ca și orice clasă și constructorii pot avea modificatori de acces:
public, protected, private și fără modificator.
Public în orice altă clasă se pot crea instanțe ale clasei respective.
Protected doar în subclase pot fi create obiecte de tipul clasei respective.
Private în nici o altă clasă nu se pot instanția obiecte ale acestei clase. O astfel de clasă poate conține metode publice (numite ”factory methods”) care să fie responsabile cu crearea obiectelor.
Implicit doar în clasele din același pachet se pot crea instanțe ale clasei respective.
Implementarea metodelor în Java
Metodele în Java sunt folosite pentru a schimba comportamentul unui obiect al unei clase. Intrucît Java este un limbaj de programare complet orientat-obiect,orice clasă poate conține o mulțime de metode și sunt descrise în interiorul clasei respective. Declararea generală a unei metode:
[modificatori] TypeReturn nume ( [arg1, arg2….arg n] )
[throws TipExceptie1, TipExceptie2, …TipExceptie n]
{
// Corpul metodei
}
Ca și în cazul claselor sau a constructorilor, metodele au modificatori :
modificatori de acces : public, protected, private.
unul din cuvintele rezervate: static, abstract, final, native, synchro, synchronized.
Static – deci metoda aparține clasei și nici intr-un caz obiectului.
static void metodaA();
Abstract – este metodă care n-are implimentare, poate să nu conțină corp și dacă avem într-o clasă o metodă abstractă atunci și clasa devine abstractă.
Final – o metodă finală nu mai poate fi redefinită(@Override) în clasele care moștenesc clasa părinte. Este util de utilizat dacă metoda are o implementare care nu trebuie schimbată sub nici o formă în subclasele ei.
Native –dacă avem librării care sunt scrise în alt limbaj, cum ar fi C/C++ și ASM, acestea pot fi refolosite din programele Java..
Synchronized – se folosește cînd o metodă lucrează sau este apelată la un moment dat cu mai multe fire de execuție. Deci, în acest caz un fir nu apelează metodă pînă nu află ca nu este folosită de alte resurse.
O metodă poate sau nu sa returneze valoare.Tipul pe care îl returnează o metodă poate fi atît tip primitiv cît și de referință. Corpul unei metode:
public void afisareRezultat() {
System.out.println("rezultat");
}
private void deseneaza(Shape s) {
…
return;
}
Spre deosebire de alte limbaje, în Java nu pot fi trimise ca parametri ai unei metode referințe la alte metode (funcții), însă pot fi trimise referințe la obiecte care să conțină implementarea acelor metode, pentru a fi apelate. Incepînd cu versiunea 1.5 a limbajului Java, există posibilitatea de a declara metode care să primească un număr variabil de argumente.
Excepții
O excepție este o problemă care apare în timpul execuției unui program . O excepție poate apărea din mai multe motive diferite , cum ar fi :
Un utilizator a introdus date incorecte .
Un fișier care trebuie să fie deschis , nu poate fi găsit .
O conexiune de rețea a fost pierdut în mijlocul de comunicare sau JVM sau pierderi de memorie .
Unele dintre aceste excepții sunt cauzate de utilizatorii aplicației , altele de programator , și altele de resurse fizice.Există mai multe tipuri de excepții cum ar fi
Excepții verificate : O excepție verificată de obicei este o excepție , eroare de utilizator sau o problemă care nu pot fi prevăzute de către programator în timpul elaborării aplicației anumite. Atunci cînd un fișier nu este găsit apare o excepție . Aceste excepții nu pot fi ignorate cînd se compilează aplicația .
Excepții de rulare : O excepție runtime este o excepție care apare , care de obicei poate fi evitată de către dezvoltatorul de aplicații . Spre deosebire de excepții verificate , aceste excepții pot fi ingorate .
Erori : Sunt probleme care nu apar de la dezvoltatorul aplicației sau de la utilizator . Erorile sunt de obicei ignorate în codul dvs. În cazul în care se produce o depășire de stivă , o eroare va apărea . Ele sunt , de asemenea, ignorate în momentul compilării
Corpul unei excepții:
.try {
// Instructiuni care pot genera exceptii
}
catch (TipExceptie1 variabila) {
// Tratarea exceptiilor de tipul 1
}
catch (TipExceptie2 variabila) {
// Tratarea exceptiilor de tipul 2
}
finally {
// Cod care se executa indiferent
//daca apar sau nu exceptii
}
Obligatoriu un bloc de instrucțiuni ”try” trebuie să fie urmat de unul sau mai multe blocuri ”catch”, și opțional putem să folosim blocul “finally” care se execută tot timpul, adîcă a fost sau nu prinsă vreo eroare.
Fig.1
Fire de execuție
Java este un limbaj de programare multithreaded, ceea ce înseamnă că putem să dezvoltăm programe multithreaded folosind Java. Un program multithreaded conține două sau mai multe părți, care pot rula în același timp și fiecare parte se poate ocupa de diferite sarcini în același timp utilizarea optimă a resurselor disponibile, în special atunci când computerul are mai multe procesoare. De multitasking definiție este atunci când mai multe procese partajeză resursele de procesare comune, cum ar fi un procesor. Multithreading extinde ideea de multitasking în aplicații. Fiecare dintre firele pot rula în paralel. Sistemul de operare împarte timpul de procesare, nu numai între diferite aplicații, dar, de asemenea, pentru fiecare fir într-o aplicație. Multithreading vă permite să scriem într-un mod în care mai multe activități pot proceda în același timp și în același program. De multe ori, firele îsi desfășoară activitatea în fundal însă, evident, acest lucru nu este obligatoriu. Deci, un fir de execuție este o instanță a unei clase. Firele de execuție definite de o clasă vor avea același cod și, prin urmare, aceeași secvența de instrucțiuni. Crearea unei clase care să definească fire de execuție poate fi facută prin două modalități:
cu extinderea clasei Thread.
prin implementarea interfeței Runnable.
Cea mai simplă metodă de a crea un fir de execuție care să realizeze o anumită acțiune este prin extinderea clasei Thread și supradefinirea metodei run a acesteia. Formatul general al unei astfel de clase este:
public class FirExcecutie extends Thread {
public FirExcecutie(String nume) {
// Apelam constructorul superclasei
super(nume);
}
public void run() {
// Codul firului de executie
} }
După crearea sa, un fir de execuție poate fi făcut demon, sau scos din această stare, cu metoda setDaemon.
Sistemul de gestiune a bazelor de date – MySQL
Conceptul de SGBD
Toate organizațiile importante (bănci, instituții, întreprinderi) utilizează sisteme
informatice(SI) de gestiune a colecțiilor de date cu care operează. Un astfel de sistem este format din aplicații prin care se fac prelucrările de date din diferite compartimente ale organizației. Sistemul are ca punct central o bază de date care este creată, întreținută și exploatată prin intermediul unui produs software numit SGBD, adică un SGBD este un ansamblu de produse software care se află între utilizator și baza de date și îndeplinește executarea unei cereri și returnează rezultatul. Utilizatorii au acces prin intermediul unei interfețe cu ajutorul căreia se stabilesc parametrii interogării (cererii) și se primește r/s. Întregul ansamblu este reprezentat în următoarea figură:
Fig.2
Un SGBD include 2 categorii de module:
Module care sunt comune cu cele ale sistemului de operare a unui calculator;
Module cu funcții specifice bazei de date.
și 2 categorii de subsisteme:
Subsisteme monitor, care conțin programe de control al perifericelor și sistemelor de gestiune a fișierelor;
Subsisteme externe, care sunt alcătuite de procesorul de def. și progr. de administrare.
Orice SGBD conține:
limbajul de descriere a datelor care permite descrierea structurii bazei de date, a componenței, a relațiilor dintre componentele și a drepturilor de acces al utilizării bazei de date;
limbajul de cereri este limbajul în care se scriu programele pentru realizarea prelucrării datelor;
limbajul de prelucrare a datelor, care permite oper. asupra bazei de date, cum ar fi: încărcarea bazei de date, inserarea, ștergerea, căutarea sau modificarea unui element, relizarea unei statistici.
SGBD are următoarele funcții:
administrarea directă a datelor în memoria externă. Această funcție presupune susținerea structurii necesare în memoria externă atît pentru păstrarea datelor, care sunt părți componente ale bazei de date, cît și pentru alte scopuri. De exemplu: pentru accelerarea accesului la baza de date;
administrarea bufferelor din memoria operativă. SGBD lucrează cu baze de date de dimensiuni semnificative. Evident că la accesarea fiecărui element este nevoie de a buferiza datele în memoria operativă, însă uneori buferizarea respectivă nu este îndeajuns. Din aceste considerente SGBD susține un set propriu de bufere în memoria operativă cu propriul algoritm de utilizare;
administrarea tranzacțiilor. Tranzacția reprezintă o succesiune de operații asupra bazei de date, care împreună cu baza de date formează SGBD. În cazul cînd tranzacția este executată pe deplin, SGBD fixează o stare numită COMMIT, care ajută la asigurarea integrității logice a bazei de date. Starea respectivă începe o dată cu formarea unei noi tranzacții și continuă pe toată perioada tranzacției pînă la finisarea acesteia. Ca rezultat, funcția COMMIT este stopată. Chiar dacă sistemul conține mai mulți utilizatori, iar tranzacțiile sunt gestionate corect, fiecare utilizator are impresia că utilizează singur baza de date;
administrarea jurnalizării datelor. Una din proprietățile de bază a SGBD este fiabilitatea (posibilitatea) păstrării datelor în memoria externă, adică dacă a avut loc orice cădere, de tip lordware sau software SGBD trebuie să fie în stare să restabilească ultima stare a bazei de date. Jurnalul reprezintă o parte specială a bazei de date inaccesibilă utilizatorilor ți întreținută într-un mod foarte strict, în ceea ce privește informația despre toate înscrierile în baza de date.
susținerea limbajelor bazei de date. Pentru lucrul cu baza de date se utilizează limbaje specifice, numite limbaje ale bazei de date. Cel mai frecvent se utilizează 2 limbaje:
limbajul de definire a schemei bazei de date SDL (Schema Definition Language);
limbajul de manipulare a datelor DML (Data Manipulating Language).
De obicei, pentru formarea unui SGBD se utilizează 2 nivele:
nivelul intern sau nucleul;
compilatorul SGBD, de obicei, SQL.
Nucleul SGBD este responsabil pentru administrarea datelor în memoria externă, gestiunea buferelor în memoria operativă, administrarea datelor și jurnalizarea. Acest nucleu posedă o interfață proprie, care este utilizată doar de programul SQL și programele utilizate a bazei de date.
Compilatorul are destinația de a transfera instrucțiunile scrise în limbajul bazei de date într-un cod executabil pentru diverse limbaje SQL.
MySQL
MySQL este un sistem de gestiune a bazelor de date relațional, care a fost produs de compania suedeza MySQL AB și distribuit sub o licență numită Licența Publică Generală GNU. Este cel mai folosit SGBD la ora actuală deoarece este open-source, fiind o componentă cheie a stivei LAMP (Linux, Apache, MySQL, PHP). De obicei este folosit foarte des cu limbajul de programare PHP, însă cu ajutorul lui MySQL se pot construi aplicații destul de complexe în orice limbaj cum ar fi C/C++ sau Java. Există multe scheme API disponibile pentru MySQL care ne pot permite să scriem aplicații în numeroase limbaje de programare pentru accesarea bazelor de date MySQL, cum sunt: C, C++, C#, Java, Perl, PHP, Python, FreeBasic, etc.. O interfață de tip ODBC denumită MyODBC permite altor limbaje de programare ce folosesc această interfață, să interacționeze cu bazele de date MySQL cum ar fi ASP sau Visual Basic. În sprijinul acestor limbaje de programare, unele companii produc componente de tip COM/COM+ sau .NET (pentru Windows) prin intermediul cărora respetivele limbaje să poată folosi acest SGBD mult mai ușor decât prin intermediul sistemului ODBC. Aceste componente pot fi gratuite (ca de exemplu MyVBQL) sau comerciale.
Licența GNU GPL nu permite încorporarea MySQL în softuri comerciale; cei care doresc să facă acest lucru pot achiziționa, contra cost, o licență comercială de la compania producătoare, MySQL AB.
MySQL este componentă integrată a platformelor LAMP sau WAMP (Linux/Windows-Apache-MySQL-PHP/Perl/Python). Popularitatea sa ca aplicație web este strâns legată de cea a PHP-ului care este adesea combinat cu MySQL și denumit Duo-ul Dinamic. În multe cărți de specialitate este precizat faptul ca MySQL este mult mai ușor de invățat și folosit decât multe din aplicațiile de gestiune a bazelor de date, ca exemplu comanda de ieșire fiind una simplă și evidentă: „exit” sau „quit”.
Pentru a administra bazele de date MySQL se poate folosi modul linie de comandă sau, prin descărcare de pe internet, o interfață grafică: MySQL Administrator și MySQL Query Browser. Un alt instrument de management al acestor baze de date este aplicația gratuită, scrisă în PHP, phpMyAdmin.
MySQL poate fi rulat pe multe dintre platformele software existente: AIX, FreeBSD, GNU/Linux, Mac OS X, NetBSD, Solaris, SunOS, Windows 9x/NT/2000/XP/Vista.
MySQL este dotat cu un sistem de asistență performant:
MySQL include un manual de referință de mari dimensiuni (450 de pagini si mai crește…)
Sunt disponibile contracte de asistență tehnică de la dezvoltatorii MySQL, pentru cei care preferă un acord formal.
Există o listă de corespondență activă, la care se poate înscrie oricine. Această listă conține numeroși participanți utili, inclusiv dezvoltatorii MySQL. Ca resursă pentru asistență, mulți o găsesc suficientă pentru necesitățile proprii.
Distribuția MySQL include următoarele instrumente:
Un server SQL. Acesta este motorul care activează MySQL si care furnizează accesul la bazele dumneavoastră de date.
Programe client pentru accesul la server.
O bibliotecă client pentru scrierea propriilor dumneavoastră programe. Puteți scrie programe client în C, deoarece biblioteca este scrisă în C, dar biblioteca mai furnizează si baza pentru terțe asocieri pentru alte limbaje.
MySQL nu este un produs Open Source, dar, în general, poate fi folosit gratuit. MySQL oferă o gamă largă de operatori și funcții pe care le puteți folosi pentru a regăsi, afișa și manipula date. Regulile pentru evaluarea expresiilor includ regulile care controlează conversiile de tip, atunci când o valoare de un tip este folosită într-un context care impune o valoare de un alt tip.
MySQL execută automat conversii masive de tip, în conformitate cu genul de operații pe care o efectuați, ori de câte ori o valoare de un tip este folosită într-un context cari necesită o valoare de un alt tip.
Object-relational mapping
Este o tehnologie de programare, care conectează (leagă) o bază de date relațională cu conceptele orientat-obiect a limbajelor de programare (OOP) și crează o bază de date virtuală. ORM prevede separarea completă a sarcinilor într-o aplicație bine proiectată, în care atât baza de date cît și aplicația poate lucra cu datele în forma lor originală. ORM creează “virtual” schema bazei de date în memorie și permite să se manipuleze cu datele la nivel de obiecte. Esența problemei, care este rezolvată prin utilizarea ORM tehnologiei, este necesitatea de a converti structurile obiect în memoria aplicației într-o așa o formă în care să poată fi stocat în baze de date relaționale (și nu numai), precum și pentru problema inversă – implementarea modelului relațional în obiecte, cu salvarea obiectelor și a relațiilor dintre ele.
Avantaje:
Micșorează timpul dezvoltatorilor pentru elaborarea aplicațiilor.
ORM codul este bine testat și optimizat deci nu de cele mai multe ori nu trebuie testat.
Susține dialectele limbajului SQL a celor mai importante SGBD.
Aplicațiile scrise cu ajutorul Hibernate devin crossplatform pentru SGBD.
Permite strategii de mapare flexibile.
Manipularea datelor la nivelul obiectelor.
Asigură persistența obiectelor.
Permite folosirea SQL interogărilor dacă avem nevoie.
Poate crea schema Bazei de date dacă sunt descrise POJO clasele și Hibernate.cfg.xml.
Capitolul II –Instrumente folosite, framework-ul Hibernate
Framework-ul Hibernate
Hibernate – reprezintă o biblioteca pentru limbajul de programare Java,concepută pentru a aborda problemele legate de tehnologia object-relational mapping. Acesta este un bibliotecă gratuită și open source (sursă deschisă), distribuită sub licența GNU Lesser General Public. A fost lansat in 2001 ca alternativa la J2BE-style entity beans si in prezent se afla la versiunea 4.1.9, incepandu-se dezvolatrea pentru versiunea 5. Hibernate rezolva problema „object-relational impedance mismatch”, problema ce apare atunci cand un sistem de gestiune al bazelor de date relationale este folosit de un program scris intr-un limbaj de programare orientat obiect.
Arhitectura Hibernate:
Fig. 3
POJO (Persistent Object) – clase Java care conțin doar cîmpuri și metodele de acces la ele (în cazul nostru fiecare tabelă din BD conține cîte o astfel de clasă în care sunt indicate cîmpurile tabelei)
SessionFactory- clasă singletone, care conține o colecție de căi către toate clasele deja compilate, cu posibilitatea creării acestor clase.
Session- flux într-o singură direcție, de o singură utilizare, ca legătură între Aplicație și Baza de date.
Transaction- o unitate de lucru cu baza de date care susține funcționalitatea tranzacției. Tranzacțiile în Hibernate sunt gestionate de către un manager de tranzacții .
Mapping- maparea claselor Java la tabelele bazei de date, se realizează prin configurarea unui fișier XML sau prin utilizarea adnotării (annotations) în Java.
Structura unui program Hibernate:
Fig. 4
Principala caracteristica a Hibernate este maparea intre clasele Java si tabelele bazelor de date precum si intre tipurile de date Java si SQL. Hibernate pune la dispozitie posibilitatea redactarii de query-uri si data-retrieval. Salvarea datelor (reprezentate prin clase) intr-un spatiu de storare se numeste persistenta.
Persistența este proprietatea unei stări (sau colecție de informații) de a supraviețui independent de procesul care a generat acea stare. Un bun exemplu este relația RAM – HDD, dacă deschidem spre exemplu aplicația Paint și începem să desenăm ceva, acel desen va fi păstrat în RAM până când decidem să îl salvăm pe HDD. În momentul când salvăm acel desen putem spune că va supravețui independent chiar dacă cade curentul sau chiar dacă continuăm să desenăm (bineînțeles asta cât timp nu suprascriem desenul).
Ideea folosirii persistenței, în cazul nostru, este că în loc să accesam baza de date ori de câte ori avem nevoie, copiem datele din tabele si le punem in obiecte Java (Instanțe ale claselor Java). În concluzie persistența, în cazul nostru, ar fi un Copy din Baza de Date, Paste în obiectele Java. Efectuăm ce operații dorim după care facem Update la Baza de Date.
Motivul folosirii persistenței este viteza de funcționare a sistemului, astfel preluăm toată informația printr-o tranzacție și nu mai este necesară interogarea Bazei de Date atât de des.
Maparea claselor Java la tabelele bazei de date este realizată prin configurarea unui fișier XML sau folosind Java Annotations.Cand se foloseste un fisier XML, Hibernate poate genera cod sursa pentru clasele persistente.Acest lucru nu este necesar cand sunt folosite adnotari.Hibernate poate folosi fisierul XML pentru a menține schema bazei de date.Sunt asigurate facilităti de realizare a asocierilor între clase de tipul unu-la- mulți sau mulți-la-mulți, dar și asocieri reflexive cînd un obiect are o relație de tipul unu-la-mulți cu o instanță de același tip.
Configurarea unei tabele folosind .XML fișier:
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<!—Denumirea clasei și a tabelei din baza de date –>
<class name="Employee" table="EMPLOYEE">
<meta attribute="class-description">
</meta>
<!—Denumirea primului cimp id care e cheie primară, type se indica tipul cîmpului și column numele coloanei din BD –>
<id name="id" type="int" column="id">
<!—Auto-generare a cîmpului –>
<generator class="autoincrement"/>
</id>
<!—Următoarele cîmpuri din tabelă care sunt cîmpuri simple, se indică den. variabilei in POJO class, numele coloanei în BD, tipul variabilei –>
<property name="firstName" column="first_name" type="string"/>
<property name="lastName" column="last_name" type="string"/>
<property name="salary" column="salary" type="int"/>
</class>
</hibernate-mapping>
Adnotările folosite pentru a mapa o tabelă:
Adnotările reprezintă un mecanism prin care informații suplimentare sunt furnizate la nivelul
programului. Adnotările nu prezintă un efect direct asupra operațiilor codului pe care îl adnotează și
sunt utilizate de regulă pentru:
a oferi informații compilatorului – adnotările pot fi utilizate de compilator in detecția
erorilor sau pentru suprimarea mesajelor de avertizare.
pentru procesarea de la runtime
procesare la compilare și instalare – anumite instrumente software pot apela la informația
suprinsă de adnotări pentru a genera cod, fișiere în anumite formate, completarea de informație a anumitor cîmpuri din baze de date, etc.
Adnotările în Hibernate pot fi împărțite în două categorii:
Logice – descriu modelul obiectual, asocierile claselor
Fizice – descriu schemele fizice, tabelele, coloanele, indecșii.
Adnotările folosite:
@Entity – fiecare clasă POJO persistentă este o entitate si se declară folosind aceasta adnotare, la nivel de clasă.
@Table – definirea unei tabele.
@Column – Poate fi folosită pentru a suprascrie valorile default de configurare ale unei coloane. Conține parametrii length (lungimea cîmpului), nullable (dacă pot fi introduce valori nule în BD), unique (ne ajută sa nu avem dublicate în BD dacă avem nevoie)
@Id – poate fi definită proprietatea entității ce are rol de identificator (PK).
@GeneratedValue – strategie de generare a valorilor.
@OneToOne – legarea a două entități cu legatură one-to-one.
@ManyToOne – legarea a două entități cu legătura mulți la unu.
@ManyToMany – legarea a două entități cu legătura mulți la mulți.
Hibernate asigură persistența transparentă pentru POJO, denumire folosită pentru a arata că un obiect nu este un obiect special ci un obiect Java normal.Singura cerintă pentru clasa persistentă este un constructor fară argumente dar care nu este necesar sa fie public.Comportament corespunzator în anumite aplicatii necesită de asemenea atenție sporită la metodele equals() și hashCode().
Colectiile de date sunt de obicei stocate în obiecte cum ar fi Set și List.Obiectele similare pot fi configurate astfel încat sa transmită operațiile de la unul către celalalt.De exemplu, un obiect părinte denumit album poate fi configurat sa transmită operațiile de salvare și/sau ștergere obiectelor copil melodie, operație ce reduce timpul de dezvoltare.O funcție de tipul dirty checking asigură evitarea acțiunilor de scriere în baza de date efectuand update-uri sql doar asupra cîmpurilor modificate sau obiectelor persistente.Hibernate asigură un limbaj inspirat din SQL denumit Hibernate Query Language.
Hibernate Query Language (HQL) – este un limbaj Orientat obiect, similar cu SQL, dar în loc de a opera cu tabela și coloane, HQL operează cu obiectele persistente și proprietățile lui. Interogări HQL sunt traduse de Hibernate în interogări convenționale SQL care pot efectua o acțiune cu baza de date. Deși se poate utiliza SQL direct cu Hibernate folosind SQL nativ, este recomandat să se folosească HQL ori de câte ori este posibil, pentru a evita complicații portabilitate de baze de date.
Hibernate poate fi folosit atît în aplicațiile Java standarte dar și în aplicații Java EE folosind servlet-uri și componente de servicii JBI. De asemenea poate fi introdus ca o componentă în alte limbaje de programare, de exemplu Adobe integrează Hibernate în versiunea 9 a ColdFusion ce rulează pe servere de aplicatii J2EE. Fiecare clasă a proiectului trebuie să implementeze pattern-ul Data Acces Object (DAO).
Data Acces Object sau DAO este un Design Pattern în care printr-o Clasă DAO se oferă o interfață abstractă la o bază de date sau la un mecanism de persistență.
În clasele de tipul DAO sunt descrise metodele unei anumite tabele din Baza de date, pentru fiecare tabelă din Baza de date trebuie creată cite o clasă DAO care va conține metodele care pot fi aplicate asupra unei tabele anume.
Fiecare aplicație scrisă pe Hibernate conține un fișier de tip .xml care face legatura cu BD, indică ce driveri se folosesc, cîți utilizatori se pot conecta la Baza de Date și multe altele.
Exemplu simplu de fișier xml (config.hbm.xml):
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="hibernate.connection.password">password</property>
<property name="hibernate.connection.url">jdbc:mysql://URL</property>
<property name="hibernate.connection.username">root</property>
<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
<property name="show_sql">true</property>
<mapping resource="indicarea tabelei1 "></mapping>
…..
<mapping resource= "indicarea tabelei n" ></mapping>
</session-factory>
</hibernate-configuration>
Practic la runtime, Hibernate generează comenzile SQL potrivite scutind astfel programatorul de griji cum ar fi manipularea manuala a datelor, conversia obiectelor. Printre singurele constrîngeri impuse se numară următorul lucru: constructorul clasei trebuie sa fie fară argumente la implementare, daca ne dorim o clasa persistenta, si de asemenea el nu trebuie sa fie public. Fiecare clasa pentru a putea fi persistenta are nevoie de un fișier de mapare. Acesta construiește de fapt o traducere prin care se incarcă/returnează obiecte de business în/din baza de date.
Maven
Maven – sistem de construire și management al proiectelor, este scris pe Java. Face parte din proiectele care fac parte din Apache Software Foundation. Este un instrument open source (instrument cu codul sursă deschis) și care este pe larg utilizat de majoritatea proiectelor Java, cît și de altele proiecte complexe. Un instrument pentru build se axează în principal pe preprocesare sau compilare, sau packaging, testare, distribuție ș.a.m.d. Un instrument pentru management, cum ar fiMaven, în plus față de capacitățile de build pe care le are, și care sunt cu mult mai simple și ușoare în folosire, acesta mai prevede de asemenea și un ciclu de viață al proiectului nostru, un sistem de management al dependențelor pe care noi le includem, sau poate rula rapoarte, genera o pagină web a proiectului nostru, ne facilitează comunicarea între membrii echipei de lucru prin oferirea unei interfețe comune, și multe alte facilități.
Principiile de bază pe care le prevede Maven:
Convention over Configuration – un concept foarte simplu și eficient. Sistemele, bibliotecile și framework-urile trebuie să definească valori implicite rezonabile. Fără a necesita configurare inutilă, sistemele ar trebui simplu să lucreze. Maven include acest concept prin furnizarea unor seturi implicite pentru proiecte. Fără nici o personalizare și configurare, codul sursă se presupune a fi în: src/main/java și aresurselor în: src/main/resources. Testele se presupun a fi în:
src/test și proiectul se asumă să producă un fișier JAR. Maven presupune că se dorește ca byte-codul să fie compilat în target/classes și apoi să se creeze un fișier JAR repartizabil (distributable) în target. Maven aplică un set comun de convenții pentru compilarea codului sursă, ambalarea fișierelor pentru repartizare, generarea de pagini web, și multe alte procese. Dacă se urmează convențiile, Maven va necesita un efort minim, aproape de zero – doar trebuie de plasat sursele în directoarele corecte și Maven va avea grijă de restul.
O interfață comună – înainte ca Maven să propună o interfață unică pentru a face build la produsele software, fiecare proiect avea sistemul său propriu de build. Fiecare developer care dorea să facă build la proiect trebuia să se întrebe un șir de întrebări.Ce va produce build-ul? De ce biblioteci și librării am nevoie? De unde să le descarc?Unde trebuie să le pun? Ce comandă sau goal (scop) trebuie să rulez? Developerii aveau nevoie de ceva timp ca să învețe cum să facă build la un proiect sau altul. În prezent însă, atunci cînd vedem că un proiect folosește Maven, putem presupune că vom putea fară mari probleme să descarcăm sursele și să-i facem build cu mvninstall.
Abordare declarativă – totul în Maven se face într-un mod declarativ folosind Project Object Model (POM) (modelul obiect al proiectului). Noi nu doar compilăm codul sursă, ci creăm o descriere a proiectului și atributelor acestuia, în același timp alocîndu-i proiectului un set unic de coordonate.
Maven se bazează pe conceptul unui depozit central, local situat pe calculatorul personal unde se stochează artefacte, cum ar fi biblioteci sau componente create de dezvoltator. Când se crează un proiect nou, trebuie de specificat un proiect Object Model (POM) într-un fișier special numit pom.xml. Prin acest fișier se transmit catre Maven informații cu privire la bibliotecile și diferitele componente de care depinde aplicația anumită. Cînd Maven începe să construiască aplicația, acesta va aduce mai întîi aceste componente de la unul sau mai multe depozite aflate la distantă (remote – în general, situate pe internet) și a le va stoca în depozitul local. În mod implicit, depozitul local este situat la C: \ Documents and Settings \ numele de utilizator. M2 depozit \.
Tag-urile relevante in contextul creării unui proiect de tip maven sunt:
<parent> – Parinte: aplicația nu are nici un parent din punct de vedere Maven;
<artifactId> – Identificator artifact: aplicația are ca grup Maven org.iesc.nume si ca nume de artifact. Atat in pom-ul principal, cat și în toate celelalte pom-uri, sintaxa acestei convenții:
<groupId>org.iesc.nume</groupId>
<artifactId>nume-<<nume-modul>></artifactId>
<version> – Versiunea aplicației: aceasta aplicație folosește numere minore și majore, în formatul: X.Y.Z-SNAPSHOT. Standardul Maven de notare și incrementare al acestor cifre fiind:
X (număr major) identifică versiunea majoră a aplicatiei; se incrementează odată cu un refactoring major sau ca urmare a adaugării de funcționalitati ce modifică mai mult de jumatate din aplicație.
Y (numar minor) identifică versiunea API-ului de comunicare cu serviciul web; se incrementează atunci cand apar modificari în modulul common ce impactează definitia WSDL.
Z (numar minor) identifică versiunea implementării pentru versiunea curenta a API-ului.
Dupa cum este ușor de inteles, numarul Z se resetează la 1 atunci cand numarul Y se incrementează.
<developers> – Lista programatorilor ce participă la acest proiect. Informatie utilă in cazul integrării cu un sistem de constuire automată.
<scm> – Detalii legate de publicarea surselor aplicației în cazul unei lansari în producție.
<dependencyManagement> – Administrator de dependințe: locul în care se definește totalitatea dependințelor Maven ce pot fi folosite in cadrul aplicației.
<modules> – Totalitatea modulelor legate de acest proiect.
Nucleul Maven este foarte puțin implicat în sarcinile legate de build-ul proiectului dvs. Singur, Maven nu știe cum să compileze codul dvs. sau cum să creeze un fișier JAR. Maven deleagă tot acest lucru către plugin-urile Maven, cum ar fi plugin-ul Compiler pentru compilare, plugin-ul Jar pentru crearea fișierelor Jar, etc. Aceste plugin-uri sînt descărcate din repozitoriul central Maven la prima necesitate. Atunci cînd descărcați Maven, dvs. descărcați doar nucleul Maven, care constă dintr-un shell care știe doar să analizeze comenzile din linia de comandă, să gestioneze classpath-ul, să analizeze fișierul POM și să descarce plugin-uri Maven atunci cînd este necesar. Prin păstrarea plugin-ului Compiler separat de nucleul Maven și asigurarea unui mecanism de actualizare, Maven face mai ușor pentru utilizatori de a avea acces la cele mai noi opțiuni în compilator. În Maven, noi nu definim sarcina de compilare într-un fișier de build, în schimb folosim plugin-ul Compiler care este împărtășit de fiecare utilizator de Maven. Dacă apare o îmbunătățire a plugin-ului Compiler, atunci fiecare proiect care utilizează Maven imediat poate beneficia de această îmbunătățire fără a fi nevoie de careva schimbări. Un Plugin Maven este o colecție de unul sau mai multe goal-uri (scop, sarcină).
Un goal este o sarcină specifică, care poate fi executat ca un goal de sine stătător sau împreună cu alte goal-uri ca parte a unui build mai mare. Un goal este o unitate de lucru în Maven. Exemple de goal-uri includ goal-ul compile din plugin-ul Compiler care compilează tot codul sursă al proiectului, sau goal-ul test din plugin-ul Surefire care execută unit testele. Goal-urile sînt configurate cu ajutorul proprietăților de configurare care pot fi utilizate pentru a personaliza comportamentul acestora. Maven prevede de asemenea posibilitatea de a defini plugin-uri personalizate. Un plug-in personalizat poate fi scris în Java sau în orice alt limbaj, inclusiv Ant, Groovy, Ruby, beanshell.
Pentru a executa un singur goal al unui plug-in Maven vom folosi sintaxa mvn compiler:compile, unde compiler este prefixul plugin-ului și compile este goal-ul. De asemenea putem transmite perechi -Dname=value ca argumente atunci cînd executăm un goal. Aceste argumente sînt sub forma de -D proprietăți, similare cu acele opțiuni care pot fi transmise către Java Virtual Machine din linia de comandă.
IDE Spring Tool Suite (STS)
IDE este o abreviere care înseamnă: Mediu de dezvoltare a programelor de calculator (din engleză Integrated Development Environment).
Spring Tool Suite este Open Source este o platformă de dezvoltare a aplicațiilor alcătuită din framework-uri extensibile, unelte și medii de rulare pentru dezvoltarea și întreținerea de aplicații.
Se oferă suport pentru o mare varietate de limbaje de programare (C, C++, Java), dintre care cel mai folosit de utilizatori este Java IDE,inclusiv pentru dezvoltarea de aplicații web (ce folosesc limbaje interpretate precum PHP ori chiar pagini web bazate pe JSP – Java Server Pages). Spring Tool Suite a fost la început dezvoltat de IBM, după care l-a oferit comunității open-source. Prima varianta de Spring Tool Suite a apărut in Noiembrie 2001, și, de atunci a continuat să se dezvolte.
Platforma Spring Tool Suite este bazată pe Eclipse și aduce o noutate, și anume arhitectura bazată pe plugin-uri. În continuare putem vedea o variantă simplificată a acestei arhitecturi. Spring Tools Suite are un micro-nucleu, si, cu excepția acestuia, totul este scris sub forma unui plug-in. Fiecare plug-in este lansat de acest micro-nucleu. Fiind o platforma deschisa utilizatorii pot beneficia de o serie de facilitati :acces gratis, posibilitatea de a lua parte la dezvoltarea acestei sau de adaptare la nevoile personale.
Platforma Spring Tool Suit include JDT(Java Development Tools) o extensie care suporta toate versiunile de JAVA.
Arhitectura extensiilor (plug-in Spring Tool Suite)
Fig.5
Spring Tool Suite este foarte inovatoare: pe langă obișnuitul concept de Workspace, proiectele si conexiunile remote, care include interfața, Spring Tool Suite introduce conceptul de View: configurări speciale ale editorului.
Arhitectura Mediului Spring Tool Suite
Fig.6
Aceasta arhitectura ne oferă o serie de avantaje cum ar fi :
modificarea toolurilor existene
realizarea de noi extensii
integrarea si interconectarea diferitelor unelte de la diversi producatori de software, deci nu depinde ce tool avem le putem integra fară mari probleme.
posibilitatea de adaptare la mediul de lucru
Cele mai populare extensii folosite de programatori în acest IDE:
Limbaje de programare: C și C++, Java, PHP. Programare colaborativă: SVN, git. Alte extensii:
Unelte GNU/Linux, o colecție cu cele mai populare unelte folosite de programatori pe platforma GNU/Linux: GNU Autotools (GNU Autoconf, GNU Automake), Valgrind, OProfile, RPM, SystemTap, GCov,GProf, LTTng.
Modelare UML
Extensie simplă pentru modelare UML (proiect academic)
Concurentul principal al Eclipse este Netbeans.
Java Server Faces
Java Server Faces este un framework care se foloseste pentru crearea de noi interfețe pentru proiecte bazate pe WEB. A fost creat de grupul Community Process (JPC) care este format din diferiti experți care au lucrat la elaborarea diferitor framework-uri cum ar fi: Jakarta Struts, Oracle, Sun, IBM, ATG.
Java Server Faces face parte din pattern-urile bazate pe sabloane WEB cum ar fi MVC(Model-View-Controller). Folosind JSF în aplicațiile noastre aplicația este mai ușor de întreținut și de dezvoltat comparativ cu alte aplicații care au fost create pe Java Server Pages. JSF are la bază un servlet care este numit Faces.
Java Server Pages oferă un șir de avantaje, cum ar fi:
putem folosi un șir de componente standard și reutilizabile
putem accesa și manipula cu componentele cu ajutorul tag-urilor JSP
putem salva starea unor componente UI și pe urmă o putem returna
interacțiunea între componente se face cu ajutorul Evenimentelor
putem crea componente noi dacă avem nevoie
putem separa componetele de funcționalitate, cea ce reprezintă un mare avantaj pentru dezvoltatorii de aplicații.
simplifica modul de creare a IDE-urilor pentru dezvoltarea de noi aplicații WEB.
Componentele pe care le folosește Java Server Pages:
Conține librării de tag-uri JSP care ajută la crearea componentelor UI.
Un set de API pentru reprezentarea componentelor interfeței utilizatorului (UI) și tratarea evenimentelor și validarea intrărilor, administrarearea stării lor, definirea navigarii in pagini, convetirea valorilor, și suport pentru internationalizare și accesibilitate.
Arhitectura framework-ului JSF
JSF este un framework orientat pe partea de server. Atunci cînd cineva încearca să facă o cerere, cererea dată ajunge prin intermediul rețelei la server și framework-ul Java Server Pages construiește o reprezentare vizuală și o afișează clienților care o accesează. Java Server Pages verifică parametrii cererii trimise de utilizator îi decodează și îi convertește la evenimentele corespunzătoare și apoi le trimite la tratarea acestor evenimente. Java Server Faces are un controller care se numește FacesServlet și cel mai des este folosit pentru rolul de transfer de date de la un capăt la altul.
Schema de lucru a containerului JSF:
Fig. 7
Folosind framework-ul Java Server Pages pentru a crea interfețe WEB și un framework pentru back-end cum ar fi framework-urile bazate pe ORM putem crea aplicații bazate pe modelul arhitectural Model-View-Controller care în momentul de față stă la baza aplicațiilor WEB. Aceasta ne permite mai ușor de a modifica tot ce ține de aspectul vizual sau cea ce ține de partea server fără a modifica sau atinge alte nivele ale aplicației pe care o dezvoltăm.
MVC modelul presupune separarea de date de aplicații, interfața cu utilizatorul și logica de control în trei componente distincte: Model, View si Controller – astfel încât modificarea de fiecare componentă poate fi efectuată în mod independent. In definirea unei component trebuie înțeles ca o bucată separată de cod, fiecare dintre care joacă un rol aparte, modele sau reprezentări, în cazul în care modelul este utilizat pentru a prelua și a manipula datele aplicației, controllerul este responsabil pentru afișarea vizibilă a datelor (de exemplu, atunci când sunt aplicate forme webu dat afara browser HTML / CSS utilizatorului serverului), și controlerul gestionează toate aceste date.
Cele trei componente sunt legate și coordonează între ele într-un continuu contact.
Imaginea de mai jos ne ilustrează modul cum comunică cele trei componente. Modelul interacționeaza cu View-ul fără să știe date despre acesta, interacționarea se face prin intermediul controlerului. Însă controlerul comunică cu ambele și cu modelul și cu view-ul și trebuie să știe tipul ambelor componente, fiindcă el ar trebui să răspundă corect la orice cerere venită de la utilizator.
Fig.8
O caracteristică importantă a bibliotecilor bazate pe Java Server Pages este ca ne poate separa tipurile de activități care sunt efectuate la crearea de aplicații WEB.
Ca și toate celelalte framefork-uri JSF are și el limetele sale:
Memorează starea componentei de request.
Ca și alte componente DataTable solicită aceleași date din Managed Bean la restore view phase. Adică dacă obținem datele din Bean atunci viteza de operare va fi lentă.
PostBack action – fiecare link, button va avea ca efect o astfel de acțiune și este problematic de lucrat cu ferestre modale.
Una din cele mai mari probleme este performanță scăzută, adică nu se prea folosește la aplicații unde performanța este pe primul loc.
Numele și extensiile paginilor pot crea confuzii deoarece paginile se termină cu extensia .jsp iar url-urile pot sa aibă extensie .faces sau .jsf.
În aplicațiile care folosesc Java Server Pages este mai puțină transparență, multe dintre acțiuni se întîmplă în spatele nostru.
O altă problemă este documentația limitată, dacă comparăm cu alte API-uri cum ar fi JSP sau Servlet, nu prea există resurse online și mulți începători cred că documentația este confuză.
Capitolul III – Descrierea aplicației
În urma studierii tehnologiei ORM și în special framework Hibernate care este unul dintre cele mai folosite framework în elaborarea aplicațiilor. Pentru a demonstra punctele forte a tehnologiei Object Relational Mapping și a framework Hibernate am elaborat o aplicație simplă cu o interfață bazată pe Framework-ul Primefaces și anume tehnologia Java Server Pages. Această aplicație ar putea duce evidența de împrumuturi într-o bibliotecă, adică se poate de urmărit ce abonat și ce cărți a împrumutat și anume pe ce dată. Putem să vedem și ce cărti are biblioteca și să vizualizăm date despre cărti cum ar fi: autorii care au scris cartea, genul literar al cărții, numărul de pagini, descrierea cărții ș.a.m.d. User-ul sau bibliotecarul poate să coordoneze cu baza de date și anume, poate adăuga o nouă carte, edita datele, șterge o anumită informație. După ce abonatul returnează cărțile, userul poate să închidă împrumut adică, trebuie să adauge data cînd s-au întors cărțile.
Cum putem vedea din teoria expusă mai sus la baza aplicației este framework-ul Hibernate, care ne ajută să interacționăm cu baza de date a aplicației și să facem un șir de operații asupra bazei de date. Ca sistem de gestiune a bazei de date s-a folosit MySQL, iar pentru a vizualiza datele într-o formă cît mai plăcută s-a folosit tehnologia Java Server Faces și anume framework-ul Primefaces.
Aplicația realizată are un sistem de logare pentru useri și administratori.
Fig.9
În urma tastării butonului “Autentificare” se va deschide o fereastră în dependență de ce nume și parolă se introduce.
Pagina de administrator a sistemului informatic care ne afișează toate cărțile din bibliotecă și informație despre ele:
Fig. 10
Vom prezenta mai jos o tabelă care n-are chei străine, spre exemplu pagina Edituri.
Fig.11
Putem vedea un șir de butoane așezate pe pagină, ele ne ajută să operăm cu baza de date:
– acest buton ne ajută să adăug o nouă înregistrare în dependență de pagina pe care ne aflăm.
– acest buton ne ajută să vizualizăm o înregistrare în dependență de cîmpul ales.
– acest buton ne ajută să edităm o înregistrare în dependență de cîmpul ales.
-acest buton ne ajută să stergem o înregistrare în dependență de cîmpul ales.
– putem să căutam date sau sa le sortăm.
– ne ajută la paginarea conținutului.
La accesarea unuia din butoanele Adăugare sau Editează, ne apare un formă cu cîmpurile corespunzătoare. Editarea datelor a unui abonat:
Fig.12
Cea mai complexă formă de adăugare a informației este la entitatea Carti:
Fig.13
Cum am spus mai sus, sistemul informatic este creat din două părți, userul simplu poate doar să adauge un nou abonat, să adauge un nou împrumut și să primească cărțile inapoi.
Pentru a adăuga un nou împrumut avem elaborată o formă, în care userul introduce datele corespunzătoare.
Forma de adaugare a unui User, dacă un cîmp sau cîteva cîmpuri n-au fost completate ne apare un mesaj de eroare:
Fig.14
Forma de adăugare a unui nou împrumut conține doar cîteva cîmpuri cum ar fi: alegerea unui abonat din baza de date, alegerea cărților pe care abonatul dorește să le împrumute și data cînd s-a făcut împrumutul:
Fig.15
Concluzie:
Java este predecesorul tuturor celorlalte limbaje de programare este open source iar aplicațiile realizate în Java sunt independente de platforma pe care rulează, aspecte ce au făcut ca Java sa fie preferat de amatori și profesioniști deopotrivă. Tehnologiile de mapare relational obiectuală există de multi ani, Hibernate fiind printre primele poate chiar prima biblioteca ORM, realizată pentru platforma Java. . S-a dovedit în nenumărate rînduri ca Hibernate deține capacitațile necesare implementării tehnicii ORM. Din punct de vedere al dezvoltatorului crearea manuală a entităților și a relațiilor dintre ele ajută mai mult la înțelegerea detaliilor unui program. Cum am putut observa, principala caracteristică a Hibernate este maparea între clasele Java si tabelele bazelor de date precum și între tipurile de date Java si SQL.
Desigur, faptul că se poate utiliza fară SQL – este un plus, dar nu trebuie de uitat despre dezavantaje, cel mai principal dezavantaj ține de performanță. Desigur, ca aplicația care folosește codul SQL-va fi mult mai rapidă decât utilizarea Hibernate. Cu toate acestea, SQL trebuie să fie scris bine, iar Hibernate generează interogări optimizate. Dezvoltatorilor le ia o mulțime de timp de a scri interogări, proceduri stocate, însă folosind Hibernate se accelerează procesul de dezvoltare a aplicației. ORM susține dialectele limbajului SQL a celor mai importante SGBD. Aplicațiile scrise pe baza acestei tehnologii devin crossplatform pentru SGBD, adică foarte ușor aplicația se adaptează la alt SGBD, doar se schimbă driverul în principalul fișier de configurare (Hibernate.cfg.xml). Se poate crea schema Bazei de date dacă sunt descrise POJO clasele și Hibernate.cfg.xml. Întreținerea proiectelor dezvoltate cu ajutorul a ORM este mai ușor de făcut, încă un lucru important în dezvoltarea acestor aplicații este ca se folosește principiul orientat obiect (OO) și scutește programatorii de a scri cod care se repetă.
Folosind toate tehnologiile de programare care le oferă JavaEE este ușor de a crea o aplicație entreprise însă trebuie de ales tehnologiile care se potrivesc cel mai bine pentru un anumit tip de problemă. Deci, pentru a crea aplicația am folosit framework-ul Hibernate care este foarte utilizat de către programatorii care scriu pe Java, un alt fapt pentru care l-am ales anume pe el este că are un șir mare de avantaje și mai puține dezavantaje în comparație cu alt framework ORM cum este iBatis sau framework-ul NHibernate care este scris pentru C#.
Elaborarea acestei aplicații m-a ajutat mult deoarece am văzut cum e să treci prin greutățile întîlnite în crearea unui aplicații. Sper că experiența obținută mă va ajuta pe viitor. Elaborarea tezei m-a ajutat în formarea mea ca viitor specialist, în special mi-am format deprinderi practice de lucru în domeniul JavaEE.
Bibliografie:
http://www.wikipedia.org/ (vizualizat 15 aprilie 2014)
http://www.google.com/ (vizualizat 10 aprilie 2014)
http://www.hibernate.org/ (vizualizat 18 martie 2014)
http://www.dzone.com/tutorials/hibernate (vizualizat 25 martie 2014)
http://www.primefaces.com/showcase/ui/home.jsf (vizualizat 17 aprilie 2014)
Scott W. Ambler: Mapping Objects to Relational Databases: O/R Mapping In Detail
Core J2EE Design Pattern: Data Access Objects
JPA Performance Benchmark
Hibernate In Action
POJOs In Action
Hibernate Reference
Java Persistence with Hibernate
Anexă:
Am vizualizat o mică parte din codul sursă al aplicației, și anume clasele Book.java, BookDAO.java, BookImplDAO și BookManagedBean.java.
Book.java
package com.example.library.model.entity;
import java.io.Serializable;
import java.util.Date;
import java.util.Set;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.ManyToMany;
import javax.persistence.ManyToOne;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
@Entity
@Table(name = "Book")
public class Book implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue
@Column(name = "ISBN")
private int ISBN;
@Column(name = "title", unique = true, nullable = false)
private String title;
@Column(name = "description", unique = false, nullable = false)
private String description;
@Column(name = "an", unique = false, nullable = true)
@Temporal(TemporalType.DATE)
private Date an;
@Column(name = "nrPage", unique = false, nullable = false)
private int nrPage;
@ManyToMany(fetch = FetchType.EAGER)
@JoinTable(name = "BookAuthor", joinColumns = { @JoinColumn(name = "ISBN") }, inverseJoinColumns = { @JoinColumn(name = "idAuthor") })
private Set<Author> author;
@ManyToOne
@JoinColumn(name = "idGenre", referencedColumnName = "idGenre")
private Genre idGenre;
@ManyToOne
@JoinColumn(name = "idLang", referencedColumnName = "idLang")
private Lang idLang;
@ManyToOne
@JoinColumn(name = "idPublisher", referencedColumnName = "idPublisher")
private Publisher idPublisher;
@ManyToOne
@JoinColumn(name = "idColectie", referencedColumnName = "idColectie")
private Colectie idColectie;
@ManyToMany(fetch = FetchType.EAGER)
@JoinTable(name = "BookLoan", joinColumns = { @JoinColumn(name = "ISBN") }, inverseJoinColumns = { @JoinColumn(name = "idLoan") })
private Set<Loan> loan;
public Book() {
}
public int getISBN() {
return ISBN;
}
public void setISBN(int iSBN) {
ISBN = iSBN;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
public Date getAn() {
return an;
}
public void setAn(Date an) {
this.an = an;
}
public int getNrPage() {
return nrPage;
}
public void setNrPage(int nrPage) {
this.nrPage = nrPage;
}
public Set<Author> getAuthor() {
return author;
}
public void setAuthor(Set<Author> author) {
this.author = author;
}
public Genre getIdGenre() {
return idGenre; }
public void setIdGenre(Genre idGenre) {
this.idGenre = idGenre;
}
public Lang getIdLang() {
return idLang;
}
public void setIdLang(Lang idLang) {
this.idLang = idLang;
}
public Publisher getIdPublisher() {
return idPublisher;
}
public void setIdPublisher(Publisher idPublisher) {
this.idPublisher = idPublisher;
}
public Colectie getIdColectie() {
return idColectie;
}
public void setIdColectie(Colectie idColectie) {
this.idColectie = idColectie;
}
public Set<Loan> getLoan() {
return loan;
}
public void setLoan(Set<Loan> loan) {
this.loan = loan;
}
}
BookDAO.java
package com.example.library.model.DAO;
import java.util.ArrayList;
import java.util.Date;
import java.util.Set;
import com.example.library.model.entity.Author;
import com.example.library.model.entity.Book;
import com.example.library.model.entity.Colectie;
import com.example.library.model.entity.Genre;
import com.example.library.model.entity.Lang;
import com.example.library.model.entity.Publisher;
public interface BookDAO {
public void addBook(Book book) throws Exception;
public ArrayList<Book> getAllBook() throws Exception;
public boolean deleteBook(int id) throws Exception;
public void updateBook(int id, String title, String description, Date an,
int nrPage, Set<Author> author, Genre genre, Lang lang,
Publisher publisher, Colectie colectie) throws Exception;
}
BookImplDAO.java:
package com.example.library.model.implDAO;
import java.util.ArrayList;
import java.util.Date;
import java.util.Set;
import org.hibernate.Criteria;
import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.Transaction;
import com.example.library.model.DAO.BookDAO;
import com.example.library.model.entity.Author;
import com.example.library.model.entity.Book;
import com.example.library.model.entity.Colectie;
import com.example.library.model.entity.Genre;
import com.example.library.model.entity.Lang;
import com.example.library.model.entity.Publisher;
import com.example.library.model.utilities.HibernateUtil;
public class BookImplDAO implements BookDAO {
public void addBook(Book book) throws Exception {
Session session = null;
Transaction transaction = null;
try {
session = HibernateUtil.getSessionFactory().openSession();
transaction = session.beginTransaction();
session.save(book);
session.getTransaction().commit();
} catch (HibernateException e) {
if (transaction != null)
transaction.rollback();
}
if (session != null && session.isOpen()) {
session.close();
}
}
@SuppressWarnings("unchecked")
public ArrayList<Book> getAllBook() throws Exception {
Session session = null;
Transaction transaction = null;
ArrayList<Book> list = null;
try {
session = HibernateUtil.getSessionFactory().openSession();
transaction = session.beginTransaction();
list = (ArrayList<Book>) session.createCriteria(Book.class)
.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY).list();
session.getTransaction().commit();
return list;
} catch (HibernateException e) {
if (transaction != null)
transaction.rollback();
} finally {
if (session != null && session.isOpen()) {
session.close();
}
}
return null;
}
public boolean deleteBook(int id) throws Exception {
Session session = null;
Transaction transaction = null;
try {
session = HibernateUtil.getSessionFactory().openSession();
transaction = session.beginTransaction();
Book book= (Book) session.get(Book.class, id);
session.delete(book);
session.getTransaction().commit();
return true;
} catch (HibernateException e) {
if (transaction != null)
transaction.rollback();
} finally {
if (session != null && session.isOpen()) {
session.close();
}
}
return false;
}
public void updateBook(int id, String title, String description, Date an,
int nrPage, Set<Author> author, Genre genre, Lang lang,
Publisher publisher, Colectie colectie) throws Exception {
Session session = null;
Transaction transaction = null;
try {
session = HibernateUtil.getSessionFactory().openSession();
transaction = session.beginTransaction();
Book book = (Book) session.get(Book.class, id);
book.setISBN(id);
book.setTitle(title);
book.setDescription(description);
book.setAn(an);
book.setNrPage(nrPage);
book.setAuthor(author);
book.setIdGenre(genre);
book.setIdLang(lang);
book.setIdPublisher(publisher);
book.setIdColectie(colectie);
session.update(book);
session.getTransaction().commit();
} catch (HibernateException e) {
if (transaction != null)
transaction.rollback();
} finally {
if (session != null && session.isOpen()) {
session.close();
}
}
}
}
BookManagedBean.java:
package com.example.library.ManagerBean;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.event.ActionEvent;
import javax.faces.model.SelectItem;
import org.primefaces.model.DualListModel;
import com.example.library.model.entity.Author;
import com.example.library.model.entity.Book;
import com.example.library.model.entity.City;
import com.example.library.model.entity.Colectie;
import com.example.library.model.entity.Customer;
import com.example.library.model.entity.Genre;
import com.example.library.model.entity.Lang;
import com.example.library.model.entity.Publisher;
import com.example.library.model.utilities.Factory;
@ManagedBean(name = "bookMBean")
@ViewScoped
public class BookManagedBean implements Serializable {
private static final long serialVersionUID = 1L;
private List<Book> book;
private DualListModel<Author> author1;
private List<Author> target;
private List<Book> filteredBook;
private Book selectedBook;
private Book current = new Book();
// for converter
private Genre selectedGenre;
private ConverterGenre genreConverter;
private Publisher selectedPublisher;
private ConverterPublisher publisherConverter;
private Lang selectedLang;
private ConverterLang langConverter;
private Colectie selectedColectie;
private ConverterColectie colectieConverter;
private Author selectedAuthor;
private ConverterAuthor authorConverter;
public String title;
public String description;
public int nrPage;
public Date an;
public Genre genre;
public Lang lang;
public Publisher publisher;
public Colectie colectie;
public Author author;
private SelectItem[] bookFilter;
public BookManagedBean() throws Exception {
book = new ArrayList<Book>();
target = new ArrayList<Author>();
// converter objects
genreConverter = new ConverterGenre();
publisherConverter = new ConverterPublisher();
langConverter = new ConverterLang();
colectieConverter = new ConverterColectie();
authorConverter = new ConverterAuthor();
populateBook(book);
author1 = new DualListModel<Author>(ConverterAuthor.authors, target);
}
private void populateBook(List<Book> list) {
try {
book = Factory.getInstance().getBookDAO().getAllBook();
} catch (Exception e) {
}
}
public void deleteBook() {
try {
if (Factory.getInstance().getBookDAO()
.deleteBook(selectedBook.getISBN()))
book.remove(selectedBook);
} catch (Exception e) {
}
}
public void addBook(ActionEvent actionEvent) {
Book book = new Book();
book.setISBN(0);
book.setTitle(title);
book.setDescription(description);
book.setAn(an);
book.setNrPage(nrPage);
book.setIdColectie(selectedColectie);
book.setIdGenre(selectedGenre);
book.setIdLang(selectedLang);
book.setIdPublisher(selectedPublisher);
Set<Author> set = new HashSet<Author>(author1.getTarget());
book.setAuthor(set);
try {
Factory.getInstance().getBookDAO().addBook(book);
} catch (Exception e) {
e.printStackTrace();
}
}
public void editBook(ActionEvent actionEvent) {
}
public List<Author> getAuthorsForBook(Book book) {
List<Author> AuthorsName = new ArrayList<Author>();
if (book != null) {
for (Author author : book.getAuthor()) {
AuthorsName.add(author);
}
return AuthorsName;
} else
return null;
}
// setters/getters
public List<Book> getBook() {
return book;
}
public void setBook(List<Book> book) {
this.book = book;
}
public List<Book> getFilteredBook() {
return filteredBook;
}
public void setFilteredBook(List<Book> filteredBook) {
this.filteredBook = filteredBook;
}
public Book getSelectedBook() {
return selectedBook;
}
public void setSelectedBook(Book selectedBook) {
this.selectedBook = selectedBook;
}
public Book getCurrent() {
return current;
}
public void setCurrent(Book current) {
this.current = current;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
public int getNrPage() {
return nrPage;
}
public void setNrPage(int nrPage) {
this.nrPage = nrPage;
}
public Date getAn() {
return an;
}
public void setAn(Date an) {
this.an = an;
}
public Genre getGenre() {
return genre;
}
public void setGenre(Genre genre) {
this.genre = genre;
}
public Lang getLang() {
return lang;
}
public void setLang(Lang lang) {
this.lang = lang;
}
public Publisher getPublisher() {
return publisher;
}
public void setPublisher(Publisher publisher) {
this.publisher = publisher;
}
public Colectie getColectie() {
return colectie;
}
public void setColectie(Colectie colectie) {
this.colectie = colectie;
}
public SelectItem[] getBookFilter() {
return bookFilter;
}
public void setBookFilter(SelectItem[] bookFilter) {
this.bookFilter = bookFilter;
}
public Genre getSelectedGenre() {
return selectedGenre;
}
public void setSelectedGenre(Genre selectedGenre) {
this.selectedGenre = selectedGenre;
}
public ConverterGenre getGenreConverter() {
return genreConverter;
}
public void setGenreConverter(ConverterGenre genreConverter) {
this.genreConverter = genreConverter;
}
public Publisher getSelectedPublisher() {
return selectedPublisher;
}
public void setSelectedPublisher(Publisher selectedPublisher) {
this.selectedPublisher = selectedPublisher;
}
public ConverterPublisher getPublisherConverter() {
return publisherConverter;
}
public void setPublisherConverter(ConverterPublisher publisherConverter) {
this.publisherConverter = publisherConverter;
}
public Lang getSelectedLang() {
return selectedLang;
}
public void setSelectedLang(Lang selectedLang) {
this.selectedLang = selectedLang;
}
public ConverterLang getLangConverter() {
return langConverter;
}
public void setLangConverter(ConverterLang langConverter) {
this.langConverter = langConverter;
}
public Colectie getSelectedColectie() {
return selectedColectie;
}
public void setSelectedColectie(Colectie selectedColectie) {
this.selectedColectie = selectedColectie;
}
public ConverterColectie getColectieConverter() {
return colectieConverter;
}
public void setColectieConverter(ConverterColectie colectieConverter) {
this.colectieConverter = colectieConverter;
}
public Author getAuthor() {
return author;
}
public void setAuthor(Author author) {
this.author = author;
}
public Author getSelectedAuthor() {
return selectedAuthor;
}
public void setSelectedAuthor(Author selectedAuthor) {
this.selectedAuthor = selectedAuthor;
}
public ConverterAuthor getAuthorConverter() {
return authorConverter;
}
public void setAuthorConverter(ConverterAuthor authorConverter) {
this.authorConverter = authorConverter;
}
public List<Author> getTarget() {
return target;
}
public void setTarget(List<Author> target) {
this.target = target;
}
public DualListModel<Author> getAuthor1() {
return author1;
}
public void setAuthor1(DualListModel<Author> author1) {
this.author1 = author1;
}
Bibliografie:
http://www.wikipedia.org/ (vizualizat 15 aprilie 2014)
http://www.google.com/ (vizualizat 10 aprilie 2014)
http://www.hibernate.org/ (vizualizat 18 martie 2014)
http://www.dzone.com/tutorials/hibernate (vizualizat 25 martie 2014)
http://www.primefaces.com/showcase/ui/home.jsf (vizualizat 17 aprilie 2014)
Scott W. Ambler: Mapping Objects to Relational Databases: O/R Mapping In Detail
Core J2EE Design Pattern: Data Access Objects
JPA Performance Benchmark
Hibernate In Action
POJOs In Action
Hibernate Reference
Java Persistence with Hibernate
Anexă:
Am vizualizat o mică parte din codul sursă al aplicației, și anume clasele Book.java, BookDAO.java, BookImplDAO și BookManagedBean.java.
Book.java
package com.example.library.model.entity;
import java.io.Serializable;
import java.util.Date;
import java.util.Set;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.ManyToMany;
import javax.persistence.ManyToOne;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
@Entity
@Table(name = "Book")
public class Book implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue
@Column(name = "ISBN")
private int ISBN;
@Column(name = "title", unique = true, nullable = false)
private String title;
@Column(name = "description", unique = false, nullable = false)
private String description;
@Column(name = "an", unique = false, nullable = true)
@Temporal(TemporalType.DATE)
private Date an;
@Column(name = "nrPage", unique = false, nullable = false)
private int nrPage;
@ManyToMany(fetch = FetchType.EAGER)
@JoinTable(name = "BookAuthor", joinColumns = { @JoinColumn(name = "ISBN") }, inverseJoinColumns = { @JoinColumn(name = "idAuthor") })
private Set<Author> author;
@ManyToOne
@JoinColumn(name = "idGenre", referencedColumnName = "idGenre")
private Genre idGenre;
@ManyToOne
@JoinColumn(name = "idLang", referencedColumnName = "idLang")
private Lang idLang;
@ManyToOne
@JoinColumn(name = "idPublisher", referencedColumnName = "idPublisher")
private Publisher idPublisher;
@ManyToOne
@JoinColumn(name = "idColectie", referencedColumnName = "idColectie")
private Colectie idColectie;
@ManyToMany(fetch = FetchType.EAGER)
@JoinTable(name = "BookLoan", joinColumns = { @JoinColumn(name = "ISBN") }, inverseJoinColumns = { @JoinColumn(name = "idLoan") })
private Set<Loan> loan;
public Book() {
}
public int getISBN() {
return ISBN;
}
public void setISBN(int iSBN) {
ISBN = iSBN;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
public Date getAn() {
return an;
}
public void setAn(Date an) {
this.an = an;
}
public int getNrPage() {
return nrPage;
}
public void setNrPage(int nrPage) {
this.nrPage = nrPage;
}
public Set<Author> getAuthor() {
return author;
}
public void setAuthor(Set<Author> author) {
this.author = author;
}
public Genre getIdGenre() {
return idGenre; }
public void setIdGenre(Genre idGenre) {
this.idGenre = idGenre;
}
public Lang getIdLang() {
return idLang;
}
public void setIdLang(Lang idLang) {
this.idLang = idLang;
}
public Publisher getIdPublisher() {
return idPublisher;
}
public void setIdPublisher(Publisher idPublisher) {
this.idPublisher = idPublisher;
}
public Colectie getIdColectie() {
return idColectie;
}
public void setIdColectie(Colectie idColectie) {
this.idColectie = idColectie;
}
public Set<Loan> getLoan() {
return loan;
}
public void setLoan(Set<Loan> loan) {
this.loan = loan;
}
}
BookDAO.java
package com.example.library.model.DAO;
import java.util.ArrayList;
import java.util.Date;
import java.util.Set;
import com.example.library.model.entity.Author;
import com.example.library.model.entity.Book;
import com.example.library.model.entity.Colectie;
import com.example.library.model.entity.Genre;
import com.example.library.model.entity.Lang;
import com.example.library.model.entity.Publisher;
public interface BookDAO {
public void addBook(Book book) throws Exception;
public ArrayList<Book> getAllBook() throws Exception;
public boolean deleteBook(int id) throws Exception;
public void updateBook(int id, String title, String description, Date an,
int nrPage, Set<Author> author, Genre genre, Lang lang,
Publisher publisher, Colectie colectie) throws Exception;
}
BookImplDAO.java:
package com.example.library.model.implDAO;
import java.util.ArrayList;
import java.util.Date;
import java.util.Set;
import org.hibernate.Criteria;
import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.Transaction;
import com.example.library.model.DAO.BookDAO;
import com.example.library.model.entity.Author;
import com.example.library.model.entity.Book;
import com.example.library.model.entity.Colectie;
import com.example.library.model.entity.Genre;
import com.example.library.model.entity.Lang;
import com.example.library.model.entity.Publisher;
import com.example.library.model.utilities.HibernateUtil;
public class BookImplDAO implements BookDAO {
public void addBook(Book book) throws Exception {
Session session = null;
Transaction transaction = null;
try {
session = HibernateUtil.getSessionFactory().openSession();
transaction = session.beginTransaction();
session.save(book);
session.getTransaction().commit();
} catch (HibernateException e) {
if (transaction != null)
transaction.rollback();
}
if (session != null && session.isOpen()) {
session.close();
}
}
@SuppressWarnings("unchecked")
public ArrayList<Book> getAllBook() throws Exception {
Session session = null;
Transaction transaction = null;
ArrayList<Book> list = null;
try {
session = HibernateUtil.getSessionFactory().openSession();
transaction = session.beginTransaction();
list = (ArrayList<Book>) session.createCriteria(Book.class)
.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY).list();
session.getTransaction().commit();
return list;
} catch (HibernateException e) {
if (transaction != null)
transaction.rollback();
} finally {
if (session != null && session.isOpen()) {
session.close();
}
}
return null;
}
public boolean deleteBook(int id) throws Exception {
Session session = null;
Transaction transaction = null;
try {
session = HibernateUtil.getSessionFactory().openSession();
transaction = session.beginTransaction();
Book book= (Book) session.get(Book.class, id);
session.delete(book);
session.getTransaction().commit();
return true;
} catch (HibernateException e) {
if (transaction != null)
transaction.rollback();
} finally {
if (session != null && session.isOpen()) {
session.close();
}
}
return false;
}
public void updateBook(int id, String title, String description, Date an,
int nrPage, Set<Author> author, Genre genre, Lang lang,
Publisher publisher, Colectie colectie) throws Exception {
Session session = null;
Transaction transaction = null;
try {
session = HibernateUtil.getSessionFactory().openSession();
transaction = session.beginTransaction();
Book book = (Book) session.get(Book.class, id);
book.setISBN(id);
book.setTitle(title);
book.setDescription(description);
book.setAn(an);
book.setNrPage(nrPage);
book.setAuthor(author);
book.setIdGenre(genre);
book.setIdLang(lang);
book.setIdPublisher(publisher);
book.setIdColectie(colectie);
session.update(book);
session.getTransaction().commit();
} catch (HibernateException e) {
if (transaction != null)
transaction.rollback();
} finally {
if (session != null && session.isOpen()) {
session.close();
}
}
}
}
BookManagedBean.java:
package com.example.library.ManagerBean;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.event.ActionEvent;
import javax.faces.model.SelectItem;
import org.primefaces.model.DualListModel;
import com.example.library.model.entity.Author;
import com.example.library.model.entity.Book;
import com.example.library.model.entity.City;
import com.example.library.model.entity.Colectie;
import com.example.library.model.entity.Customer;
import com.example.library.model.entity.Genre;
import com.example.library.model.entity.Lang;
import com.example.library.model.entity.Publisher;
import com.example.library.model.utilities.Factory;
@ManagedBean(name = "bookMBean")
@ViewScoped
public class BookManagedBean implements Serializable {
private static final long serialVersionUID = 1L;
private List<Book> book;
private DualListModel<Author> author1;
private List<Author> target;
private List<Book> filteredBook;
private Book selectedBook;
private Book current = new Book();
// for converter
private Genre selectedGenre;
private ConverterGenre genreConverter;
private Publisher selectedPublisher;
private ConverterPublisher publisherConverter;
private Lang selectedLang;
private ConverterLang langConverter;
private Colectie selectedColectie;
private ConverterColectie colectieConverter;
private Author selectedAuthor;
private ConverterAuthor authorConverter;
public String title;
public String description;
public int nrPage;
public Date an;
public Genre genre;
public Lang lang;
public Publisher publisher;
public Colectie colectie;
public Author author;
private SelectItem[] bookFilter;
public BookManagedBean() throws Exception {
book = new ArrayList<Book>();
target = new ArrayList<Author>();
// converter objects
genreConverter = new ConverterGenre();
publisherConverter = new ConverterPublisher();
langConverter = new ConverterLang();
colectieConverter = new ConverterColectie();
authorConverter = new ConverterAuthor();
populateBook(book);
author1 = new DualListModel<Author>(ConverterAuthor.authors, target);
}
private void populateBook(List<Book> list) {
try {
book = Factory.getInstance().getBookDAO().getAllBook();
} catch (Exception e) {
}
}
public void deleteBook() {
try {
if (Factory.getInstance().getBookDAO()
.deleteBook(selectedBook.getISBN()))
book.remove(selectedBook);
} catch (Exception e) {
}
}
public void addBook(ActionEvent actionEvent) {
Book book = new Book();
book.setISBN(0);
book.setTitle(title);
book.setDescription(description);
book.setAn(an);
book.setNrPage(nrPage);
book.setIdColectie(selectedColectie);
book.setIdGenre(selectedGenre);
book.setIdLang(selectedLang);
book.setIdPublisher(selectedPublisher);
Set<Author> set = new HashSet<Author>(author1.getTarget());
book.setAuthor(set);
try {
Factory.getInstance().getBookDAO().addBook(book);
} catch (Exception e) {
e.printStackTrace();
}
}
public void editBook(ActionEvent actionEvent) {
}
public List<Author> getAuthorsForBook(Book book) {
List<Author> AuthorsName = new ArrayList<Author>();
if (book != null) {
for (Author author : book.getAuthor()) {
AuthorsName.add(author);
}
return AuthorsName;
} else
return null;
}
// setters/getters
public List<Book> getBook() {
return book;
}
public void setBook(List<Book> book) {
this.book = book;
}
public List<Book> getFilteredBook() {
return filteredBook;
}
public void setFilteredBook(List<Book> filteredBook) {
this.filteredBook = filteredBook;
}
public Book getSelectedBook() {
return selectedBook;
}
public void setSelectedBook(Book selectedBook) {
this.selectedBook = selectedBook;
}
public Book getCurrent() {
return current;
}
public void setCurrent(Book current) {
this.current = current;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
public int getNrPage() {
return nrPage;
}
public void setNrPage(int nrPage) {
this.nrPage = nrPage;
}
public Date getAn() {
return an;
}
public void setAn(Date an) {
this.an = an;
}
public Genre getGenre() {
return genre;
}
public void setGenre(Genre genre) {
this.genre = genre;
}
public Lang getLang() {
return lang;
}
public void setLang(Lang lang) {
this.lang = lang;
}
public Publisher getPublisher() {
return publisher;
}
public void setPublisher(Publisher publisher) {
this.publisher = publisher;
}
public Colectie getColectie() {
return colectie;
}
public void setColectie(Colectie colectie) {
this.colectie = colectie;
}
public SelectItem[] getBookFilter() {
return bookFilter;
}
public void setBookFilter(SelectItem[] bookFilter) {
this.bookFilter = bookFilter;
}
public Genre getSelectedGenre() {
return selectedGenre;
}
public void setSelectedGenre(Genre selectedGenre) {
this.selectedGenre = selectedGenre;
}
public ConverterGenre getGenreConverter() {
return genreConverter;
}
public void setGenreConverter(ConverterGenre genreConverter) {
this.genreConverter = genreConverter;
}
public Publisher getSelectedPublisher() {
return selectedPublisher;
}
public void setSelectedPublisher(Publisher selectedPublisher) {
this.selectedPublisher = selectedPublisher;
}
public ConverterPublisher getPublisherConverter() {
return publisherConverter;
}
public void setPublisherConverter(ConverterPublisher publisherConverter) {
this.publisherConverter = publisherConverter;
}
public Lang getSelectedLang() {
return selectedLang;
}
public void setSelectedLang(Lang selectedLang) {
this.selectedLang = selectedLang;
}
public ConverterLang getLangConverter() {
return langConverter;
}
public void setLangConverter(ConverterLang langConverter) {
this.langConverter = langConverter;
}
public Colectie getSelectedColectie() {
return selectedColectie;
}
public void setSelectedColectie(Colectie selectedColectie) {
this.selectedColectie = selectedColectie;
}
public ConverterColectie getColectieConverter() {
return colectieConverter;
}
public void setColectieConverter(ConverterColectie colectieConverter) {
this.colectieConverter = colectieConverter;
}
public Author getAuthor() {
return author;
}
public void setAuthor(Author author) {
this.author = author;
}
public Author getSelectedAuthor() {
return selectedAuthor;
}
public void setSelectedAuthor(Author selectedAuthor) {
this.selectedAuthor = selectedAuthor;
}
public ConverterAuthor getAuthorConverter() {
return authorConverter;
}
public void setAuthorConverter(ConverterAuthor authorConverter) {
this.authorConverter = authorConverter;
}
public List<Author> getTarget() {
return target;
}
public void setTarget(List<Author> target) {
this.target = target;
}
public DualListModel<Author> getAuthor1() {
return author1;
}
public void setAuthor1(DualListModel<Author> author1) {
this.author1 = author1;
}
Copyright Notice
© Licențiada.org respectă drepturile de proprietate intelectuală și așteaptă ca toți utilizatorii să facă același lucru. Dacă consideri că un conținut de pe site încalcă drepturile tale de autor, te rugăm să trimiți o notificare DMCA.
Acest articol: Utilizarea Framework Ului Hibernate Pentru Elaborarea Aplicatiilor Web (ID: 150747)
Dacă considerați că acest conținut vă încalcă drepturile de autor, vă rugăm să depuneți o cerere pe pagina noastră Copyright Takedown.
