jproject02 hibernate ignace van tricht bert jacobs 2 juni 2009

28
JProject02 JProject02 Hibernate Hibernate Ignace Van Tricht Ignace Van Tricht Bert Jacobs Bert Jacobs 2 Juni 2009 2 Juni 2009

Upload: benjamin-baert

Post on 14-Jun-2015

219 views

Category:

Documents


3 download

TRANSCRIPT

Page 1: JProject02 Hibernate Ignace Van Tricht Bert Jacobs 2 Juni 2009

JProject02JProject02Hibernate Hibernate

Ignace Van TrichtIgnace Van TrichtBert JacobsBert Jacobs2 Juni 20092 Juni 2009

Page 2: JProject02 Hibernate Ignace Van Tricht Bert Jacobs 2 Juni 2009

TopicsTopics► Context Context ► De Database De Database

ERDERD ProbleemstellingProbleemstelling

► HibernateHibernate VoordelenVoordelen WerkingWerking Configuratie bestandConfiguratie bestand

► Vertaling Hibernate naar OOVertaling Hibernate naar OO Primary keysPrimary keys RelatieRelatie Hibernate & Fetching StrategieënHibernate & Fetching Strategieën Lazy FetchingLazy Fetching

► Van Hibernate naar ModelVan Hibernate naar Model Hibernate QueryingHibernate Querying CRUDCRUD ControllerController

► DebuggingDebugging► ConclusiesConclusies

Page 3: JProject02 Hibernate Ignace Van Tricht Bert Jacobs 2 Juni 2009

ContextContext

►Risico in gebruik webapplicatieRisico in gebruik webapplicatie Multithreading stateless environmentMultithreading stateless environment

►ObjectiefObjectief Oplossing aanbieden voor risicovermindering Oplossing aanbieden voor risicovermindering

in gebruik webapplicatie in gebruik webapplicatie

►Voorgestelde oplossingVoorgestelde oplossing Gebruik van framework HibernateGebruik van framework Hibernate

►Demonstratie binnen voorgestelde Demonstratie binnen voorgestelde applicatieapplicatie

Page 4: JProject02 Hibernate Ignace Van Tricht Bert Jacobs 2 Juni 2009

DatabaseDatabase

Page 5: JProject02 Hibernate Ignace Van Tricht Bert Jacobs 2 Juni 2009

ERDERD

Page 6: JProject02 Hibernate Ignace Van Tricht Bert Jacobs 2 Juni 2009

Probleem: transactie Probleem: transactie inconsistentiesinconsistenties

► Webapp: Meerdere threads/simultane transacties Webapp: Meerdere threads/simultane transacties naar de databasenaar de database

► ProblemenProblemen Lost updatesLost updates Non repeatable readsNon repeatable reads Phantom readsPhantom reads

► OplossingOplossing Isolatie op connectorniveauIsolatie op connectorniveau

► SerializableSerializable traag - laag risicotraag - laag risico► Repeatable readRepeatable read► Read committedRead committed► Read uncomittedRead uncomitted snel – hoog risicosnel – hoog risico

Isolatie op persistentielaagIsolatie op persistentielaag► Optimistic lockingOptimistic locking► Pessimistic lockingPessimistic locking

Page 7: JProject02 Hibernate Ignace Van Tricht Bert Jacobs 2 Juni 2009

HibernateHibernate

Page 8: JProject02 Hibernate Ignace Van Tricht Bert Jacobs 2 Juni 2009

VoordelenVoordelen

►ORM - object relational mappingORM - object relational mapping

►Gebruik van extra encapsulatielaag Gebruik van extra encapsulatielaag (sessies)(sessies)

► Isolatie op persistentielaagIsolatie op persistentielaag

Page 9: JProject02 Hibernate Ignace Van Tricht Bert Jacobs 2 Juni 2009

Werking: scherm af wat Werking: scherm af wat varieertvarieert

►ManueelManueel Configuratie (zie volgende slide)Configuratie (zie volgende slide) MappingMapping

►AutomatischAutomatisch Herkenning van primitieve datatypes en Herkenning van primitieve datatypes en

properties (gebruik van reflectie)properties (gebruik van reflectie)

Page 10: JProject02 Hibernate Ignace Van Tricht Bert Jacobs 2 Juni 2009

Configuratie XML bestandConfiguratie XML bestand► Database specifieke instellingen (url, gebruikte driver, Database specifieke instellingen (url, gebruikte driver,

username, password)username, password)

<property name=<property name="hibernate.connection.driver_class""hibernate.connection.driver_class">>comcom..mysqlmysql..jdbcjdbc.Driver</property>.Driver</property> <property name=<property name="hibernate.connection.password""hibernate.connection.password">>babylonbabylon</property></property> <property name=<property name="hibernate.connection.url""hibernate.connection.url">jdbc:mysql://>jdbc:mysql://localhostlocalhost:3306/jproject02</:3306/jproject02</

property>property> <property name=<property name="hibernate.connection.username""hibernate.connection.username">jproject02</property> >jproject02</property>

► Definiëren van specifieke query dialectDefiniëren van specifieke query dialect► Context van sessie bepalen. Per threadContext van sessie bepalen. Per thread

<property <property name=name="hibernate.dialect""hibernate.dialect">>orgorg..hibernatehibernate.dialect.MySQLInnoDBDialect</.dialect.MySQLInnoDBDialect</property>property>

<property name=<property name="hibernate.current_session_context_class""hibernate.current_session_context_class">thread</property>>thread</property>

Page 11: JProject02 Hibernate Ignace Van Tricht Bert Jacobs 2 Juni 2009

Configuratie XML bestandConfiguratie XML bestand► Ipv standaard connectie pool wordt c3P0 gebruiktIpv standaard connectie pool wordt c3P0 gebruikt► Meerwaarde: instellingen kunnen worden aangepast met de Meerwaarde: instellingen kunnen worden aangepast met de

propertiesproperties

<property name=<property name="hibernate.c3p0.min_size""hibernate.c3p0.min_size">5</property>>5</property><property name=<property name="hibernate.c3p0.max_size""hibernate.c3p0.max_size">20</property>>20</property><property name=<property name="hibernate.c3p0.timeout""hibernate.c3p0.timeout">300</property>>300</property><property name=<property name="hibernate.c3p0.max_statements""hibernate.c3p0.max_statements">50</property>>50</property><property name=<property name="hibernate.c3p0.idle_test_period""hibernate.c3p0.idle_test_period">3000</property>>3000</property>

► Hybernate gebruikt JCL (Java Common Logging), welke Hybernate gebruikt JCL (Java Common Logging), welke hierarchisch zal aftasten startend van de root van het classpath, hierarchisch zal aftasten startend van de root van het classpath, om logger te detecteren om logger te detecteren

<property name=<property name="show_sql""show_sql">true</property>>true</property><property name=<property name="format_sql""format_sql">true</property>>true</property>

► In configuratie wordt het path naar mapping bestand In configuratie wordt het path naar mapping bestand meegegevenmeegegeven

<mapping resource=<mapping resource="jproject02/database/hibernate/Customer.hbm.xml""jproject02/database/hibernate/Customer.hbm.xml" /> />

Page 12: JProject02 Hibernate Ignace Van Tricht Bert Jacobs 2 Juni 2009

Vertaling Vertaling Hibernate naar OOHibernate naar OO

Page 13: JProject02 Hibernate Ignace Van Tricht Bert Jacobs 2 Juni 2009

Vertaling van de DB naar OO Vertaling van de DB naar OO Primary keys Primary keys

►Kritische issuesKritische issues Primary key van DB niet bruikbaar Primary key van DB niet bruikbaar

vanwege meerdere instanties in sessies vanwege meerdere instanties in sessies

►OplossingOplossing Primary keys worden vervangen door Primary keys worden vervangen door

HASH codes per instantiëring van een HASH codes per instantiëring van een DAODAO

Page 14: JProject02 Hibernate Ignace Van Tricht Bert Jacobs 2 Juni 2009

Vertaling van de DB naar OO Vertaling van de DB naar OO Relaties Relaties

► Vertaling relatieVertaling relatie Relatie in DB wordt referentie in OORelatie in DB wordt referentie in OO

► Type relaties in OOType relaties in OO One to oneOne to one

►Een referentie naar andere DAOEen referentie naar andere DAO

One to manyOne to many►List in klasseList in klasse►Set: Voorbeeld volgt laterSet: Voorbeeld volgt later►BagBag

Many to manyMany to many►Ter vervanging van transitie tabel in DB de DAO houden Ter vervanging van transitie tabel in DB de DAO houden

elk set van referenties bii van elkaar => voorbeeld elk set van referenties bii van elkaar => voorbeeld volgt latervolgt later

Page 15: JProject02 Hibernate Ignace Van Tricht Bert Jacobs 2 Juni 2009

Vertaling van de DB naar OO Vertaling van de DB naar OO Relaties Relaties

►Kritische issuesKritische issues Relaties in DB zijn bi-directioneel en Relaties in DB zijn bi-directioneel en

moeilijk te implementeren in OOmoeilijk te implementeren in OO Bi directionele relaties in OO blijven Bi directionele relaties in OO blijven

kritisch en moeten vermeden worden kritisch en moeten vermeden worden waar mogelijkwaar mogelijk

►Relaties in onze applicatieRelaties in onze applicatie Bi-directioneel: Read Bi-directioneel: Read Uni-directioneel: Up-date Uni-directioneel: Up-date

Page 16: JProject02 Hibernate Ignace Van Tricht Bert Jacobs 2 Juni 2009

Vertaling van de DB naar OO Vertaling van de DB naar OO Relaties (voorbeeld 1)Relaties (voorbeeld 1)

►Mapping one-to-manyMapping one-to-many<set name=<set name="employees""employees" inverse= inverse="true""true" cascade= cascade="all""all" lazy= lazy="true""true"

<key><key>

<column name=<column name="Categoryid""Categoryid" /> />

</key></key>

<one-to-many class=<one-to-many class="jproject02.database.hibernate.Employees""jproject02.database.hibernate.Employees" /> />

</set></set>

►Declaratie in DAO categoryDeclaratie in DAO categoryprivateprivate Set<IDB_Employee> employees = Set<IDB_Employee> employees = newnew HashSet<IDB_Employee>(0); HashSet<IDB_Employee>(0);

Page 17: JProject02 Hibernate Ignace Van Tricht Bert Jacobs 2 Juni 2009

Vertaling van de DB naar OO Vertaling van de DB naar OO Relaties (voorbeeld 2)Relaties (voorbeeld 2)

►Mapping many to manyMapping many to manyProject:Project:<set name=<set name="attachments""attachments" table= table="ProjectAttachment""ProjectAttachment" cascade= cascade="all""all" lazy= lazy="true""true">>

<key column=<key column="Projectsid""Projectsid" /> />

<many-to-many column=<many-to-many column="Attachmentsid""Attachmentsid" class=class="jproject02.database.hibernate.Attachments""jproject02.database.hibernate.Attachments" /> />

</set></set>

Attachment:Attachment: <set name=<set name="projects""projects" table= table="projectattachment""projectattachment" inverse= inverse="true""true" cascade= cascade="all""all" lazy=lazy="true""true">>

<key column=<key column="Attachmentsid""Attachmentsid" /> />

<many-to-many column=<many-to-many column="Projectsid""Projectsid" class=class="jproject02.database.hibernate.Projects""jproject02.database.hibernate.Projects" /> />

</set></set>

Page 18: JProject02 Hibernate Ignace Van Tricht Bert Jacobs 2 Juni 2009

Hibernate & Fetching Hibernate & Fetching strategieënstrategieën

►Hibernate ondersteunt volgende fetching Hibernate ondersteunt volgende fetching strategieënstrategieën Join fetchingJoin fetching Select fetchingSelect fetching Subselect fetchingSubselect fetching Batch fetchingBatch fetching Immediate fetchingImmediate fetching Proxy fetchingProxy fetching Lazy attribute fetchingLazy attribute fetching Lazy collection fetchingLazy collection fetching

Page 19: JProject02 Hibernate Ignace Van Tricht Bert Jacobs 2 Juni 2009

Lazy fetchingLazy fetching

►Waar mogelijk gekozen voor lazy Waar mogelijk gekozen voor lazy fetchingfetching Values in een collectie blijven null tot Values in een collectie blijven null tot

informatie wordt opgevraagdinformatie wordt opgevraagd Optimaliseert de queryOptimaliseert de query Vb Vb

<set name=<set name="modules""modules" lazy= lazy="true""true" cascade= cascade="all""all">>

<key column=<key column="Projectsid""Projectsid" /> />

<one-to-many class=<one-to-many class="jproject02.database.hibernate.Modules""jproject02.database.hibernate.Modules"/>/>

</set></set>

Page 20: JProject02 Hibernate Ignace Van Tricht Bert Jacobs 2 Juni 2009

Van Hibernate naar Van Hibernate naar ModelModel

Page 21: JProject02 Hibernate Ignace Van Tricht Bert Jacobs 2 Juni 2009

Hibernate & QueryingHibernate & Querying

► 3 opties3 opties Methods Methods CriteriaCriteria Plain SQL (Te vermijden, hiermee gaat Plain SQL (Te vermijden, hiermee gaat

kracht Hibernate verloren)kracht Hibernate verloren)

►Querying in onze applicatieQuerying in onze applicatie Criteria werd gebruikt als querying Criteria werd gebruikt als querying

mechanisme => Informatie toegankelijker mechanisme => Informatie toegankelijker in APIin API

Page 22: JProject02 Hibernate Ignace Van Tricht Bert Jacobs 2 Juni 2009

Hibernate & QueryingHibernate & QueryingVoorbeeld CriteriaVoorbeeld Criteria

► Criteria: DAO selecterenCriteria: DAO selecteren► Restrictions: informatie filteren vgl. where Restrictions: informatie filteren vgl. where

clausuleclausule

publicpublic List<IDB_Project> getAllProjects() { List<IDB_Project> getAllProjects() {log.debug("getting projects");log.debug("getting projects");trytry { {Criteria crit = Criteria crit =

sessionFactory.getCurrentSession().createCriteria(Projects.sessionFactory.getCurrentSession().createCriteria(Projects.classclass););crit.add(Restrictions.crit.add(Restrictions.notnot(Restrictions.(Restrictions.likelike("state", ProjectStates.("state", ProjectStates.CLOSEDCLOSED, ,

MatchMode.MatchMode.ANYWHEREANYWHERE)));)));crit.addOrder(Order.crit.addOrder(Order.descdesc("startdate"));("startdate"));

returnreturn crit.list()crit.list();;

Page 23: JProject02 Hibernate Ignace Van Tricht Bert Jacobs 2 Juni 2009

CRUD – Create Read Update CRUD – Create Read Update DeleteDelete

► CreateCreate Om DAO objecten aan te maken wordt gebruik gemaakt van Om DAO objecten aan te maken wordt gebruik gemaakt van

DAO factoryDAO factory Voorbeeld implementatie Create in onze applicatieVoorbeeld implementatie Create in onze applicatie

► publicpublic classclass DAO_Factory { DAO_Factory {publicpublic staticstatic Object getDAO(Tables table) Object getDAO(Tables table) throwsthrows InstantiationException, InstantiationException,

IllegalAccessException, ClassNotFoundException {IllegalAccessException, ClassNotFoundException {returnreturnClass.Class.forNameforName(table.getPersistentClass()).newInstance();(table.getPersistentClass()).newInstance();}}}}

► ReadRead Om DAO objecten te lezen wordt gebruik gemaakt van Om DAO objecten te lezen wordt gebruik gemaakt van

methodes van de CRUD klasse methodes van de CRUD klasse ► publicpublic List<IDB_Category> getAllCategories() { List<IDB_Category> getAllCategories() {log.debug("getting categories");log.debug("getting categories");trytry { {Criteria crit = sessionFactory.getCurrentSession().createCriteria(Category.Criteria crit = sessionFactory.getCurrentSession().createCriteria(Category.classclass););returnreturn crit.list()crit.list();;

Page 24: JProject02 Hibernate Ignace Van Tricht Bert Jacobs 2 Juni 2009

CRUD – Create Read Update CRUD – Create Read Update DeleteDelete

►UpdateUpdateProperty wordt gewijzigd in persistent object, zodra Property wordt gewijzigd in persistent object, zodra deze wordt gecommit, wordt de record in de deze wordt gecommit, wordt de record in de database ge-updatedatabase ge-update

►DeleteDelete““delete” van een persistent object wordt delete” van een persistent object wordt rechtstreeks aangeroepen op de sessie;rechtstreeks aangeroepen op de sessie;

sessionFactory.getCurrentSession().delete(persistentObject);sessionFactory.getCurrentSession().delete(persistentObject);

Page 25: JProject02 Hibernate Ignace Van Tricht Bert Jacobs 2 Juni 2009

ControllerController

► Elke DAO gaat een interface Elke DAO gaat een interface implementeren. Deze is beschikbaar implementeren. Deze is beschikbaar gesteld aan het model (contract)gesteld aan het model (contract)

►Voorbeeld Controller geimplementeerd Voorbeeld Controller geimplementeerd in onze applicatiein onze applicatie

Page 26: JProject02 Hibernate Ignace Van Tricht Bert Jacobs 2 Juni 2009

DebuggingDebugging

Page 27: JProject02 Hibernate Ignace Van Tricht Bert Jacobs 2 Juni 2009

LoggenLoggen► Log4JLog4J

ConfiguratieConfiguratielog4j.appender.stdout=log4j.appender.stdout=orgorg..apacheapache.log4j.ConsoleAppender.log4j.ConsoleAppenderlog4j.appender.stdout.Target=System.outlog4j.appender.stdout.Target=System.outlog4j.appender.stdout.layout=log4j.appender.stdout.layout=orgorg..apacheapache.log4j.PatternLayout.log4j.PatternLayoutlog4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE}log4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE}?%5p %c?%5p %c{1}{1}:%L - %m%n:%L - %m%n# Root logger option# Root logger optionlog4j.rootLogger=INFO, log4j.rootLogger=INFO, stdoutstdout# # HibernateHibernate logging options (INFO only shows startup messages) logging options (INFO only shows startup messages)log4j.logger.org.hibernate=INFOlog4j.logger.org.hibernate=INFO# Log JDBC bind parameter runtime arguments# Log JDBC bind parameter runtime argumentslog4j.logger.org.hibernate.type=INFOlog4j.logger.org.hibernate.type=INFO

LibrariesLibraries► JclJcl► Log4JLog4J

Sample outputSample outputHibernate: Hibernate:

selectselect this_.id as id18_0_,this_.id as id18_0_, this_.type as type18_0_,this_.type as type18_0_, this_.classification as classifi3_18_0_,this_.classification as classifi3_18_0_, this_.wage as wage18_0_ this_.wage as wage18_0_ fromfrom jproject02.skills this_jproject02.skills this_

Page 28: JProject02 Hibernate Ignace Van Tricht Bert Jacobs 2 Juni 2009

ConclusiesConclusies

► Hibernate voldoet aan de vooropgestelde Hibernate voldoet aan de vooropgestelde doeleindendoeleinden

► Reference Guide en Community zijn dermate Reference Guide en Community zijn dermate uitgebreid dat men soms lang kan zoeken naar uitgebreid dat men soms lang kan zoeken naar een specifiek weinig voorkomend probleem, een specifiek weinig voorkomend probleem, doch leert de ervaring dat Community doch leert de ervaring dat Community documentatie fundamenteel zal worden in documentatie fundamenteel zal worden in efficiënt implementeren van nieuwe efficiënt implementeren van nieuwe frameworks.frameworks.

► Na de initiële leercurve komt Hibernate goed Na de initiële leercurve komt Hibernate goed tot zijn recht en wordt zijn nut en zijn aandeel in tot zijn recht en wordt zijn nut en zijn aandeel in de vereenvoudiging van het geheel duidelijkde vereenvoudiging van het geheel duidelijk