prezentare hibernate

34
Prezentare Hibernate Prezentare Hibernate Mihaela Cristina Gheorghisan Mihaela Cristina Gheorghisan Software Developer Software Developer [email protected] [email protected]

Upload: bogdan-boicu

Post on 03-Jan-2016

143 views

Category:

Documents


0 download

DESCRIPTION

Hibernate presentation

TRANSCRIPT

Page 1: Prezentare Hibernate

Prezentare HibernatePrezentare Hibernate

Mihaela Cristina GheorghisanMihaela Cristina GheorghisanSoftware DeveloperSoftware Developer

[email protected]@axway.com

Page 2: Prezentare Hibernate

IntroducereIntroducere

Hibernate este o librarie obiectual-relationala Hibernate este o librarie obiectual-relationala pentru limbajul Java, oferind un framework pentru limbajul Java, oferind un framework pentru maparea dintre un model obiectual si o pentru maparea dintre un model obiectual si o baza de date relationala.baza de date relationala.

Hibernate rezolva problemele tehnice legate Hibernate rezolva problemele tehnice legate de accesul la baza de date in vederea obtinerii de accesul la baza de date in vederea obtinerii persistentei obiectelor prin punerea la persistentei obiectelor prin punerea la dispozitia utilizatorului a unor functii care dispozitia utilizatorului a unor functii care lucreaza direct cu obiectele Java, luand asupra lucreaza direct cu obiectele Java, luand asupra lor realizarea comunicarii directe cu baza de lor realizarea comunicarii directe cu baza de date.date.

Hibernate este un software open-source si Hibernate este un software open-source si este distribuit sub GNU Lesser General Public este distribuit sub GNU Lesser General Public License.License.

Page 3: Prezentare Hibernate

Caracteristici principaleCaracteristici principale

maparea dintre clasele Java si tabelele corespunzatoare din baza de maparea dintre clasele Java si tabelele corespunzatoare din baza de date;date;

maparea dintre tipurile de date Java si tipurile de date SQL;maparea dintre tipurile de date Java si tipurile de date SQL;

facilitati pentru lucrul cu baza de date : generarea apelurilor la baza facilitati pentru lucrul cu baza de date : generarea apelurilor la baza de date, interpretarea rezultatului venit de la baza de date(conversii);de date, interpretarea rezultatului venit de la baza de date(conversii);

realizarea portabilitatii codului in ceea ce priveste lucrul cu baza de realizarea portabilitatii codului in ceea ce priveste lucrul cu baza de date (pentru bazele de date care folosesc SQL); date (pentru bazele de date care folosesc SQL);

realizarea transparenta a persistentei pentru obiectele Java care realizarea transparenta a persistentei pentru obiectele Java care respecta standardul POJO (Plain Old Java Objects);respecta standardul POJO (Plain Old Java Objects);

facilitati “dirty checking” – daca unui obiect persistent i s-a modificat facilitati “dirty checking” – daca unui obiect persistent i s-a modificat un membru, actualizarea in baza de date se va face doar pentru acel un membru, actualizarea in baza de date se va face doar pentru acel membru nu pentru tot obiectul;membru nu pentru tot obiectul;

Hibernate poate fi folosit atat in aplicatii Java de sine statatoare cat si Hibernate poate fi folosit atat in aplicatii Java de sine statatoare cat si in aplicatii Java EE care folosesc servere EJB sau EJB session beans.in aplicatii Java EE care folosesc servere EJB sau EJB session beans.

Page 4: Prezentare Hibernate

ArhitecturaArhitectura

Hibernate Hibernate foloseste baza foloseste baza de date si niste de date si niste fisiere de fisiere de configuratie configuratie pentru a oferi pentru a oferi servicii de servicii de persistenta persistenta pentru pentru obiectele Java.obiectele Java.

Page 5: Prezentare Hibernate

Arhitectura si APIArhitectura si API

Hibernate API (jar-Hibernate API (jar-ul org.hibernate) ul org.hibernate) pune la dispozitie pune la dispozitie doua clase doua clase principale pentru principale pentru realizarea realizarea persistentei persistentei obiectelor : obiectelor : SessionFactory si SessionFactory si Session.Session.

Page 6: Prezentare Hibernate

Session Factory si SessionSession Factory si Session

SessionFactory SessionFactory

aceasta clasa contine aceasta clasa contine maparile penrtu o singura maparile penrtu o singura baza de date;baza de date;

o aplicatie care lucreaza cu o aplicatie care lucreaza cu mai multe baze de date va mai multe baze de date va avea mai multe clase avea mai multe clase SessionFactory;SessionFactory;

este thread-safe;este thread-safe; este immutable (read-only);este immutable (read-only); reprezinta o factory pentru reprezinta o factory pentru

obiectele de tip Session;obiectele de tip Session; reprezinta un client pentru reprezinta un client pentru

ConnectionProvider (o ConnectionProvider (o factory pentru conexiuni factory pentru conexiuni JDBC). JDBC).

SessionSession

un wrapper pentru conexiunea un wrapper pentru conexiunea JDBC;JDBC;

o factory pentru obiecte de tip o factory pentru obiecte de tip transaction;transaction;

single-threaded;single-threaded;

Page 7: Prezentare Hibernate

Posibile stari ale obiectelorPosibile stari ale obiectelor

TransientTransient obiectul nu este si nu a fost niciodata asociat cu un context obiectul nu este si nu a fost niciodata asociat cu un context

persistent (o sesiune);persistent (o sesiune); nu are identitate persistenta (cheie primara asociata).nu are identitate persistenta (cheie primara asociata).

PersistentPersistent obiectul este asociat cu un context persistent (o sesiune). obiectul este asociat cu un context persistent (o sesiune). are identitate persistenta (cheie primara asociata) si poate un are identitate persistenta (cheie primara asociata) si poate un

tuplu corespunzator in baza de date;tuplu corespunzator in baza de date; Hibernate ofera garantia ca identitatea persistenta(primary key) Hibernate ofera garantia ca identitatea persistenta(primary key)

si identitatea Java(identificatorul de obiect Java) corespund.si identitatea Java(identificatorul de obiect Java) corespund.

DetachedDetached obiectul a fost asociat cu un context persistent (o sesiune), dar obiectul a fost asociat cu un context persistent (o sesiune), dar

contextual a fost inchis;contextual a fost inchis; are identitate persistenta (cheie primara asociata) si poate un are identitate persistenta (cheie primara asociata) si poate un

tuplu corespunzator in baza de date.tuplu corespunzator in baza de date. Hibernate nu ofera nici o garantie ca identitatea Hibernate nu ofera nici o garantie ca identitatea

persistenta(primary key) si identitatea Java(identificatorul de persistenta(primary key) si identitatea Java(identificatorul de obiect Java) corespund.obiect Java) corespund.

Page 8: Prezentare Hibernate

ConfiguratiaConfiguratia

Prin fisierePrin fisiere

ProgramaticProgramatic

Page 9: Prezentare Hibernate

Configuratia prin fisiereConfiguratia prin fisiere

fisierul de configuratie se numeste hibernate.cfg.xml;fisierul de configuratie se numeste hibernate.cfg.xml;

se mai poate folosi un fisier de proprietati se mai poate folosi un fisier de proprietati hibernate.properties;hibernate.properties;

daca sunt prezente amandoua, hibernate.properties daca sunt prezente amandoua, hibernate.properties suprascrie hibernate.cfg.xml;suprascrie hibernate.cfg.xml;

Hibernate se asteapta sa gaseasca hibernate.cfg.xml in Hibernate se asteapta sa gaseasca hibernate.cfg.xml in radacina CLASSPATH-ului.radacina CLASSPATH-ului.

Odata terminata configuratia, cu ajutorul ei se poate obtine Odata terminata configuratia, cu ajutorul ei se poate obtine foarte usor un obiect de tip SessionFactory:foarte usor un obiect de tip SessionFactory:

SessionFactory sf = new SessionFactory sf = new Configuration().configure().buildSessionFactory();Configuration().configure().buildSessionFactory();

Apoi la fel de simplu se obtine o sesiune de lucru (conexiune Apoi la fel de simplu se obtine o sesiune de lucru (conexiune JDBC) :JDBC) :

Session session = sf.openSession();Session session = sf.openSession();

Page 10: Prezentare Hibernate

Configuratia programaticConfiguratia programatic

Configuration cfg = new Configuration cfg = new Configuration().addResource(“Question.hbm.xml”);Configuration().addResource(“Question.hbm.xml”);

sausau Configuration cfg = new Configuration().addClass(model.Question);Configuration cfg = new Configuration().addClass(model.Question);

cfg.setProperty(“hibernate.dialect”, cfg.setProperty(“hibernate.dialect”, “org.hibernate.dialect.Oracle10gDialect”);“org.hibernate.dialect.Oracle10gDialect”);

sausau se foloseste Configuration.setProperties(properties), Properties properties. se foloseste Configuration.setProperties(properties), Properties properties.

Odata terminata configuratia, cu ajutorul ei se poate obtine foarte usor Odata terminata configuratia, cu ajutorul ei se poate obtine foarte usor un obiect de tip SessionFactory:un obiect de tip SessionFactory:

SessionFactory sf = cfg.buildSessionFactory();SessionFactory sf = cfg.buildSessionFactory();

Apoi la fel de simplu se obtine o sesiune de lucru (conexiune JDBC) :Apoi la fel de simplu se obtine o sesiune de lucru (conexiune JDBC) : Session session = sf.openSession();Session session = sf.openSession();

Page 11: Prezentare Hibernate

Clase persistente – POJOClase persistente – POJO

Conventii POJO(Plain Old Java Object) :Conventii POJO(Plain Old Java Object) :

membri privati (recomandat, nu obligatoriu pentru membri privati (recomandat, nu obligatoriu pentru Hibernate);Hibernate);

getteri si setteri pentru membrii privati care sa respecte getteri si setteri pentru membrii privati care sa respecte conventiile JavaBean(recomandat, nu obligatoriu pentru conventiile JavaBean(recomandat, nu obligatoriu pentru Hibernate);Hibernate);

constructor fara argumente(obligatoriu – folosit de constructor fara argumente(obligatoriu – folosit de Hibernate la instantierea prin reflectie: Hibernate la instantierea prin reflectie: Constructor.newInstace());Constructor.newInstace());

un identificator pentru obiecte, folosit de Hibernate cand un identificator pentru obiecte, folosit de Hibernate cand obiectele sunt salvate (recomandat pentru a folosi toate obiectele sunt salvate (recomandat pentru a folosi toate serviciile oferite de hibernate). Setterul poate fi privat.serviciile oferite de hibernate). Setterul poate fi privat.

Page 12: Prezentare Hibernate

Fisierele *.hbm.xmlFisierele *.hbm.xml

Orice clasa persistenta are nevoie Orice clasa persistenta are nevoie de o asemenea mapare;de o asemenea mapare;

Contine maparea dintre clasa Java Contine maparea dintre clasa Java si tabela din baza de date aferenta;si tabela din baza de date aferenta;

Este situat in acelasi folder cu clasa Este situat in acelasi folder cu clasa corespunzatoare.corespunzatoare.

Page 13: Prezentare Hibernate

TuplizersTuplizers

org.hibernate.tuple.Tuplizer – interfata care org.hibernate.tuple.Tuplizer – interfata care stie sa trasforme un tuplu din baza de date stie sa trasforme un tuplu din baza de date intr-un obiect Java si invers;intr-un obiect Java si invers;

doua dintre cele mai folosite interfete sunt : doua dintre cele mai folosite interfete sunt : org.hibernate.tuple.entity.EntityTuplizerorg.hibernate.tuple.entity.EntityTuplizer org.hibernate.tuple.component.ComponentTuplizerorg.hibernate.tuple.component.ComponentTuplizer

utila pentru a folosi o clasa custom. De utila pentru a folosi o clasa custom. De exemplu in loc de HashMap se va folosi un exemplu in loc de HashMap se va folosi un CustomMap creat de utilizator;CustomMap creat de utilizator;

Page 14: Prezentare Hibernate

Tipuri de date - standardTipuri de date - standard

Page 15: Prezentare Hibernate

Tipuri de date - customTipuri de date - custom

Pentru a defini un tip de date utilizator se va implementa una dintre Pentru a defini un tip de date utilizator se va implementa una dintre interfetele:interfetele:

org.hibernate.UserTypeorg.hibernate.UserType org.hibernate.CompositeUserTypeorg.hibernate.CompositeUserType

Exemple se pot gasi in org.hibernate.test.DoubleStringType:Exemple se pot gasi in org.hibernate.test.DoubleStringType: <property name="twoStrings" <property name="twoStrings"

type="org.hibernate.test.DoubleStringType"> type="org.hibernate.test.DoubleStringType"> <column name="first_string"/> <column name="first_string"/> <column name="second_string"/><column name="second_string"/> </property></property>

Se pot defini si nume mai scurte pentru un anumit tip de date:Se pot defini si nume mai scurte pentru un anumit tip de date: <typedef <typedef

class="com.mycompany.usertypes.DefaultValueIntegerType" class="com.mycompany.usertypes.DefaultValueIntegerType" name="default_zero">name="default_zero">

</typedef></typedef> <property name="priority" type="default_zero"/> <property name="priority" type="default_zero"/>

Page 16: Prezentare Hibernate

XdocletMarkupXdocletMarkup

/** * @hibernate.class /** * @hibernate.class * table="CATS" * table="CATS" */*/public class Cat { public class Cat { private Long id; // identifier private Long id; // identifier private Date birthdate; private Date birthdate; private Cat mother; private Cat mother; private Set kittens private Set kittens /* /* * @hibernate.id * @hibernate.id * generator-class="native" * generator-class="native" * column="CAT_ID" * column="CAT_ID" */ */ public Long getId() { public Long getId() { return id; return id; } } private void setId(Long id) { private void setId(Long id) { this.id=id; this.id=id; } } …… ……....}}

Page 17: Prezentare Hibernate

Adnotatii JDK 5.0Adnotatii JDK 5.0

@Entity(access = AccessType.FIELD)@Entity(access = AccessType.FIELD)public class Customer implements Serializable{ public class Customer implements Serializable{ @Id; @Id; Long id; Long id;

String firstName; String firstName; String lastName; String lastName; Date birthday; Date birthday;

@Transient @Transient Integer age; Integer age;

@Embedded @Embedded private Address homeAddress; private Address homeAddress;

@OneToMany(cascade=CascadeType.ALL) @OneToMany(cascade=CascadeType.ALL) @JoinColumn(name="CUSTOMER_ID") @JoinColumn(name="CUSTOMER_ID") Set<Order> orders; Set<Order> orders; // Getter/setter and business methods// Getter/setter and business methods} }

Page 18: Prezentare Hibernate

Asocieri HibernateAsocieri Hibernate

Asocieri unidirectionaleAsocieri unidirectionale Many to oneMany to one One to oneOne to one One to manyOne to many

Asocieri unidirectionale folosind tabele joinAsocieri unidirectionale folosind tabele join One to manyOne to many Many to oneMany to one One to oneOne to one Many to manyMany to many

Asocieri bidirectionaleAsocieri bidirectionale One to many / many to oneOne to many / many to one One to oneOne to one

Asocieri bidirectionale folosind tabele joinAsocieri bidirectionale folosind tabele join One to many / many to oneOne to many / many to one One to oneOne to one Many to manyMany to many

Asocieri mai complexe Asocieri mai complexe

Page 19: Prezentare Hibernate

Asocieri unidirectionale : Asocieri unidirectionale : many to onemany to one

Hibernate configuration : Hibernate configuration : <class name="Person"> <class name="Person"> <id name="id" column="personId"> <id name="id" column="personId"> <generator class="native"/> <generator class="native"/> </id> </id> <many-to-one name="address" column="addressId" <many-to-one name="address" column="addressId" not-null="true"/>not-null="true"/></class></class><class name="Address"> <class name="Address"> <id name="id" column="addressId"> <id name="id" column="addressId"> <generator class="native"/> <generator class="native"/> </id></id></class></class>

Database:Database:create table Person ( personId bigint not null primary key, addressId create table Person ( personId bigint not null primary key, addressId

bigint not null )bigint not null )create table Address ( addressId bigint not null primary key ) create table Address ( addressId bigint not null primary key )

Page 20: Prezentare Hibernate

Asocieri unidirectionale : one Asocieri unidirectionale : one to one to one

Hibernate configuration : Hibernate configuration : <class name="Person"> <class name="Person"> <id name="id" column="personId"> <id name="id" column="personId"> <generator class="native"/> <generator class="native"/> </id> </id> <many-to-one name="address" column="addressId" <many-to-one name="address" column="addressId"

unique="true" not-null="true"/>unique="true" not-null="true"/></class></class><class name="Address"> <class name="Address"> <id name="id" column="addressId"> <id name="id" column="addressId"> <generator class="native"/> <generator class="native"/> </id></id></class></class>

Database:Database:create table Person ( personId bigint not null primary key, addressId create table Person ( personId bigint not null primary key, addressId

bigint not null unique )bigint not null unique )create table Address ( addressId bigint not null primary key ) create table Address ( addressId bigint not null primary key )

Page 21: Prezentare Hibernate

Asocieri unidirectionale : one Asocieri unidirectionale : one to many to many

Nu este rocomandata. Este mai bines a se foloseasca o asociere cu tabele join.Nu este rocomandata. Este mai bines a se foloseasca o asociere cu tabele join.

Hibernate configuration : Hibernate configuration : <class name="Person"> <class name="Person"> <id name="id" column="personId"> <id name="id" column="personId"> <generator class="native"/> <generator class="native"/> </id> </id> <set name="addresses"> <set name="addresses"> <key column="personId" not-null="true"/> <key column="personId" not-null="true"/> <one-to-many class="Address"/> <one-to-many class="Address"/> </set></set></class></class><class name="Address"> <id name="id" column="addressId"> <generator <class name="Address"> <id name="id" column="addressId"> <generator

class="native"/> </id>class="native"/> </id></class></class>

Database:Database:create table Person ( personId bigint not null primary key )create table Person ( personId bigint not null primary key )create table Address ( addressId bigint not null primary key, personId bigint not create table Address ( addressId bigint not null primary key, personId bigint not

null ) null )

Page 22: Prezentare Hibernate

Asocieri unidirectionale Asocieri unidirectionale folosind tabele join – many folosind tabele join – many

to manyto many Hibernate configuration : Hibernate configuration : <class name="Person"> <class name="Person"> <id name="id" column="personId"> <id name="id" column="personId"> <generator class="native"/> <generator class="native"/> </id> </id> <set name="addresses" table="PersonAddress"> <set name="addresses" table="PersonAddress"> <key column="personId"/> <key column="personId"/> <many-to-many column="addressId" unique="true" <many-to-many column="addressId" unique="true"

class="Address“ />class="Address“ /> </set></set></class></class><class name="Address"> <id name="id" column="addressId"> <class name="Address"> <id name="id" column="addressId">

<generator class="native"/> </id><generator class="native"/> </id></class></class>

Database:Database:create table Person ( personId bigint not null primary key )create table create table Person ( personId bigint not null primary key )create table

PersonAddress ( personId not null, addressId bigint not null primary PersonAddress ( personId not null, addressId bigint not null primary key )key )

create table Address ( addressId bigint not null primary key )create table Address ( addressId bigint not null primary key )

Page 23: Prezentare Hibernate

Asocieri unidirectionale Asocieri unidirectionale folosind tabele join – many folosind tabele join – many

to oneto one Acest tip de asociere este folosit indeosebi cand asocierea este optionala.Acest tip de asociere este folosit indeosebi cand asocierea este optionala.

Hibernate configuration : Hibernate configuration : <class name="Person"> <class name="Person"> <id name="id" column="personId"> <id name="id" column="personId"> <generator class="native"/> <generator class="native"/> </id> </id> <join table="PersonAddress" optional="true"> <join table="PersonAddress" optional="true"> <key column="personId" unique="true"/> <key column="personId" unique="true"/> <many-to-one name="address" column="addressId" not-null="true"/> <many-to-one name="address" column="addressId" not-null="true"/> </join></join></class></class><class name="Address"> <class name="Address"> <id name="id" column="addressId"> <id name="id" column="addressId"> <generator class="native"/> <generator class="native"/> </id></id></class></class>

Database:Database:create table Person ( personId bigint not null primary key )create table create table Person ( personId bigint not null primary key )create table

PersonAddress ( personId bigint not null primary key, addressId bigint not PersonAddress ( personId bigint not null primary key, addressId bigint not null )null )

create table Address ( addressId bigint not null primary key )create table Address ( addressId bigint not null primary key )

Page 24: Prezentare Hibernate

Asocieri unidirectionale Asocieri unidirectionale folosind tabele join – one to folosind tabele join – one to

oneone Acest gen de asociere este destul de neobisnuita.Acest gen de asociere este destul de neobisnuita.

Hibernate configuration : Hibernate configuration : <class name="Person"> <class name="Person"> <id name="id" column="personId"> <id name="id" column="personId"> <generator class="native"/> <generator class="native"/> </id> </id> <join table="PersonAddress" optional="true"> <join table="PersonAddress" optional="true"> <key column="personId" unique="true"/> <key column="personId" unique="true"/> <many-to-one name="address" column="addressId" not-null="true" <many-to-one name="address" column="addressId" not-null="true"

unique="true"/> unique="true"/> </join></join></class></class><class name="Address"> <id name="id" column="addressId"> <generator <class name="Address"> <id name="id" column="addressId"> <generator

class="native"/> </id>class="native"/> </id></class></class>

Database:Database:create table Person ( personId bigint not null primary key )create table Person ( personId bigint not null primary key )create table PersonAddress ( personId bigint not null primary key, addressId bigint create table PersonAddress ( personId bigint not null primary key, addressId bigint

not null unique )not null unique )create table Address ( addressId bigint not null primary key ) create table Address ( addressId bigint not null primary key )

Page 25: Prezentare Hibernate

Asocieri unidirectionale Asocieri unidirectionale folosind tabele join – many folosind tabele join – many

to manyto many Hibernate configuration : Hibernate configuration : <class name="Person"> <class name="Person"> <id name="id" column="personId"> <id name="id" column="personId"> <generator class="native"/> <generator class="native"/> </id> </id> <set name="addresses" table="PersonAddress"> <set name="addresses" table="PersonAddress"> <key column="personId"/> <key column="personId"/> <many-to-many column="addressId" class="Address"/> <many-to-many column="addressId" class="Address"/> </set></set></class></class><class name="Address"> <class name="Address"> <id name="id" column="addressId"> <id name="id" column="addressId"> <generator class="native"/> <generator class="native"/> </id></id></class></class>

Database:Database:create table Person ( personId bigint not null primary key )create table Person ( personId bigint not null primary key )create table PersonAddress ( personId bigint not null, addressId bigint not null, create table PersonAddress ( personId bigint not null, addressId bigint not null,

primary key (personId, addressId) )primary key (personId, addressId) )create table Address ( addressId bigint not null primary key ) create table Address ( addressId bigint not null primary key )

Page 26: Prezentare Hibernate

Asocieri bidirectionale – one Asocieri bidirectionale – one to many / many to oneto many / many to one

Hibernate configuration : Hibernate configuration : <class name="Person"> <class name="Person"> <id name="id" column="personId"> <id name="id" column="personId"> <generator class="native"/> <generator class="native"/> </id> </id> <many-to-one name="address" column="addressId" not-null="true"/><many-to-one name="address" column="addressId" not-null="true"/></class></class><class name="Address"> <class name="Address"> <id name="id" column="addressId"> <id name="id" column="addressId"> <generator class="native"/> <generator class="native"/> </id> </id> <set name="people" inverse="true"> <set name="people" inverse="true"> <key column="addressId"/> <key column="addressId"/> <one-to-many class="Person"/> <one-to-many class="Person"/> </set></set></class></class>

Database:Database:create table Person ( personId bigint not null primary key, addressId bigint not null create table Person ( personId bigint not null primary key, addressId bigint not null

))create table Address ( addressId bigint not null primary key )create table Address ( addressId bigint not null primary key )

Page 27: Prezentare Hibernate

Asocieri bidirectionale – one Asocieri bidirectionale – one to oneto one

Hibernate configuration : Hibernate configuration : <class name="Person"> <class name="Person"> <id name="id" column="personId"> <id name="id" column="personId"> <generator class="native"/> <generator class="native"/> </id> </id> <many-to-one name="address" column="addressId" unique="true" <many-to-one name="address" column="addressId" unique="true"

not-null="true"/>not-null="true"/></class></class><class name="Address"> <class name="Address"> <id name="id" column="addressId"> <id name="id" column="addressId"> <generator class="native"/> <generator class="native"/> </id> </id> <one-to-one name="person" property-ref="address"/><one-to-one name="person" property-ref="address"/></class></class>

Database:Database:create table Person ( personId bigint not null primary key, addressId create table Person ( personId bigint not null primary key, addressId

bigint not null unique )bigint not null unique )create table Address ( addressId bigint not null primary key ) create table Address ( addressId bigint not null primary key )

Page 28: Prezentare Hibernate

Asocieri bidirectionale folosind Asocieri bidirectionale folosind tabele join – one to many / many to tabele join – one to many / many to

oneone Hibernate configuration : Hibernate configuration : <class name="Person"> <class name="Person"> <id name="id" column="personId"> <id name="id" column="personId"> <generator class="native"/> <generator class="native"/> </id> </id> <set name="addresses" table="PersonAddress"> <set name="addresses" table="PersonAddress"> <key column="personId"/> <key column="personId"/> <many-to-many column="addressId" unique="true" class="Address"/> <many-to-many column="addressId" unique="true" class="Address"/> </set></set></class></class><class name="Address"> <class name="Address"> <id name="id" column="addressId"> <id name="id" column="addressId"> <generator class="native"/> <generator class="native"/> </id> </id> <join table="PersonAddress" inverse="true" optional="true"> <join table="PersonAddress" inverse="true" optional="true"> <key column="addressId"/> <key column="addressId"/> <many-to-one name="person" column="personId" not-null="true"/> <many-to-one name="person" column="personId" not-null="true"/> </join></join></class></class>

Database:Database:create table Person ( personId bigint not null primary key )create table Person ( personId bigint not null primary key )create table PersonAddress ( personId bigint not null, addressId bigint not null primary key )create table PersonAddress ( personId bigint not null, addressId bigint not null primary key )create table Address ( addressId bigint not null primary key )create table Address ( addressId bigint not null primary key )

Page 29: Prezentare Hibernate

Asocieri bidirectionale Asocieri bidirectionale folosind tabele join – one to folosind tabele join – one to

oneone Hibernate configuration : Hibernate configuration : <class name="Person"> <class name="Person"> <id name="id" column="personId"> <id name="id" column="personId"> <generator class="native"/> <generator class="native"/> </id> </id> <join table="PersonAddress" optional="true"> <join table="PersonAddress" optional="true"> <key column="personId" unique="true"/> <key column="personId" unique="true"/> <many-to-one name="address" column="addressId" not-null="true" <many-to-one name="address" column="addressId" not-null="true"

unique="true"/> unique="true"/> </join></join></class></class><class name="Address"> <class name="Address"> <id name="id" column="addressId"> <id name="id" column="addressId"> <generator class="native"/> <generator class="native"/> </id> </id> <join table="PersonAddress" optional="true“ inverse="true"> <join table="PersonAddress" optional="true“ inverse="true"> <key column="addressId" unique="true"/> <key column="addressId" unique="true"/> <many-to-one name="person" column="personId" not-null="true" unique="true"/> <many-to-one name="person" column="personId" not-null="true" unique="true"/> </join></join></class></class>

Database:Database:create table Person ( personId bigint not null primary key )create table Person ( personId bigint not null primary key )create table PersonAddress ( personId bigint not null primary key, addressId bigint not null create table PersonAddress ( personId bigint not null primary key, addressId bigint not null

unique )unique )create table Address ( addressId bigint not null primary key )create table Address ( addressId bigint not null primary key )

Page 30: Prezentare Hibernate

Asocieri bidirectionale Asocieri bidirectionale folosind tabele join – many folosind tabele join – many

to manyto many Hibernate configuration : Hibernate configuration : <class name="Person"> <class name="Person"> <id name="id" column="personId"> <id name="id" column="personId"> <generator class="native"/> <generator class="native"/> </id> </id> <set name="addresses" table="PersonAddress"> <set name="addresses" table="PersonAddress"> <key column="personId"/> <key column="personId"/> <many-to-many column="addressId" class="Address"/> <many-to-many column="addressId" class="Address"/> </set></set></class></class><class name="Address"> <class name="Address"> <id name="id" column="addressId"> <id name="id" column="addressId"> <generator class="native"/> <generator class="native"/> </id> </id> <set name="people" inverse="true" table="PersonAddress"> <set name="people" inverse="true" table="PersonAddress"> <key column="addressId"/> <key column="addressId"/> <many-to-many column="personId" class="Person"/> <many-to-many column="personId" class="Person"/> </set></set></class></class>

Database:Database:create table Person ( personId bigint not null primary key )create table PersonAddress ( personId create table Person ( personId bigint not null primary key )create table PersonAddress ( personId

bigint not null, addressId bigint not null, primary key (personId, addressId) )bigint not null, addressId bigint not null, primary key (personId, addressId) )create table Address ( addressId bigint not null primary key ) create table Address ( addressId bigint not null primary key )

Page 31: Prezentare Hibernate

Aocieri mai complexeAocieri mai complexe

Aceste asocieri sunt extreme de Aceste asocieri sunt extreme de rare, Hibernate acoperind aproape rare, Hibernate acoperind aproape toate tipurile de asocieri posibile. toate tipurile de asocieri posibile.

Page 32: Prezentare Hibernate

Lucrul cu obiecteLucrul cu obiecte

Salvarea obiectelorSalvarea obiectelor save()save() persist()persist()

= > insert in baza de date= > insert in baza de date

Incarcarea obiectelorIncarcarea obiectelor load()load() get()get() createQuery()createQuery() createSQLQuery()createSQLQuery() createFilter()createFilter() createCriteria()createCriteria()

= > select in baza de date= > select in baza de date

Actualizarea obiectelorActualizarea obiectelor update()update() saveOrUpdate()saveOrUpdate() delete()delete()

=> update sau delete in baza de date. => update sau delete in baza de date.

Page 33: Prezentare Hibernate

Lucrul cu obiecte - exempleLucrul cu obiecte - exemple

session.createQuery(from Cat as session.createQuery(from Cat as cat left join cat.kittens as kitten cat left join cat.kittens as kitten with kitten.bodyWeight > 10.0);with kitten.bodyWeight > 10.0);

session.createQuery(from Cat as session.createQuery(from Cat as cat where cat.mate.name like cat where cat.mate.name like '%s%‘);'%s%‘);

Criteria crit = session.createCriteria(Cat.class);Criteria crit = session.createCriteria(Cat.class);

crit.setMaxResults(50);crit.setMaxResults(50);

List cats = crit.list(); List cats = crit.list();

List cats = session.createCriteria(Cat.class) List cats = session.createCriteria(Cat.class)

.add( Restrictions.like("name", "F%") .add( Restrictions.like("name", "F%")

.addOrder( Order.asc("name") ) .addOrder( Order.asc("name") )

.addOrder( Order.desc("age")).addOrder( Order.desc("age"))

.setMaxResults(50) .list(); .setMaxResults(50) .list();

session.createSQLQuery("SELECT session.createSQLQuery("SELECT ID, NAME, BIRTHDATE FROM ID, NAME, BIRTHDATE FROM CATS").addEntity(Cat.class); CATS").addEntity(Cat.class);

Query query = Query query = session.createSQLQuery("SELECsession.createSQLQuery("SELECT * FROM CATS WHERE NAME T * FROM CATS WHERE NAME like ?").addEntity(Cat.class); like ?").addEntity(Cat.class);

List pusList = query.setString(0, List pusList = query.setString(0, "Pus%").list(); "Pus%").list();

Collection blackKittens = Collection blackKittens = session.createFilter( mother.getKittens()session.createFilter( mother.getKittens(), "where this.color , "where this.color = ?") .setParameter( Color.BLACK, = ?") .setParameter( Color.BLACK, Hibernate.custom(ColorUserType.class) Hibernate.custom(ColorUserType.class) ) .list() ); ) .list() );

Collection tenKittens = Collection tenKittens = session.createFilter( mother.getKittens()session.createFilter( mother.getKittens(), "") .setFirstResult(0).setMaxResults(10) , "") .setFirstResult(0).setMaxResults(10) .list(); .list();

Page 34: Prezentare Hibernate

Golirea sesiunii (flush)Golirea sesiunii (flush)

Golirea sesiunii are loc automat dupa Golirea sesiunii are loc automat dupa evenimente precum:evenimente precum: dupa un anumit numar de cereri catre baza de dupa un anumit numar de cereri catre baza de

date;date; dupa org.hibernate.Transaction.commit();dupa org.hibernate.Transaction.commit(); Session.flush().Session.flush().

Este posibil totusi a se schimba Este posibil totusi a se schimba comportamentul default al lui flush(), astfel comportamentul default al lui flush(), astfel incat sa aiba loc dupa :incat sa aiba loc dupa : numai dupa org.hibernate.Transaction.commit();numai dupa org.hibernate.Transaction.commit(); numai cand se apeleaza explicit flush().numai cand se apeleaza explicit flush().