Download de presentatie
De presentatie wordt gedownload. Even geduld aub
GepubliceerdBenjamin Baert Laatst gewijzigd meer dan 10 jaar geleden
1
Hibernate Ignace Van Tricht Bert Jacobs 2 Juni 2009
JProject02 Hibernate Ignace Van Tricht Bert Jacobs 2 Juni 2009
2
Topics Context De Database Hibernate Vertaling Hibernate naar OO
ERD Probleemstelling Hibernate Voordelen Werking Configuratie bestand Vertaling Hibernate naar OO Primary keys Relatie Hibernate & Fetching Strategieën Lazy Fetching Van Hibernate naar Model Hibernate Querying CRUD Controller Debugging Conclusies
3
Context Risico in gebruik webapplicatie Objectief
Multithreading stateless environment Objectief Oplossing aanbieden voor risicovermindering in gebruik webapplicatie Voorgestelde oplossing Gebruik van framework Hibernate Demonstratie binnen voorgestelde applicatie
4
Database
5
ERD
6
Probleem: transactie inconsistenties
Webapp: Meerdere threads/simultane transacties naar de database Problemen Lost updates Non repeatable reads Phantom reads Oplossing Isolatie op connectorniveau Serializable traag - laag risico Repeatable read Read committed Read uncomitted snel – hoog risico Isolatie op persistentielaag Optimistic locking Pessimistic locking Optimistic locking: versioning (extra kolom)
7
Hibernate
8
Voordelen ORM - object relational mapping
Gebruik van extra encapsulatielaag (sessies) Isolatie op persistentielaag
9
Werking: scherm af wat varieert
Manueel Configuratie (zie volgende slide) Mapping Automatisch Herkenning van primitieve datatypes en properties (gebruik van reflectie)
10
Configuratie XML bestand
Database specifieke instellingen (url, gebruikte driver, username, password) <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property> <property name="hibernate.connection.password">babylon</property> <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/jproject02</property> <property name="hibernate.connection.username">jproject02</property> Definiëren van specifieke query dialect Context van sessie bepalen. Per thread <property name="hibernate.dialect">org.hibernate.dialect.MySQLInnoDBDialect</property> <property name="hibernate.current_session_context_class">thread</property>
11
Configuratie XML bestand
Ipv standaard connectie pool wordt c3P0 gebruikt Meerwaarde: instellingen kunnen worden aangepast met de properties <property name="hibernate.c3p0.min_size">5</property> <property name="hibernate.c3p0.max_size">20</property> <property name="hibernate.c3p0.timeout">300</property> <property name="hibernate.c3p0.max_statements">50</property> <property name="hibernate.c3p0.idle_test_period">3000</property> Hybernate gebruikt JCL (Java Common Logging), welke hierarchisch zal aftasten startend van de root van het classpath, om logger te detecteren <property name="show_sql">true</property> <property name="format_sql">true</property> In configuratie wordt het path naar mapping bestand meegegeven <mapping resource="jproject02/database/hibernate/Customer.hbm.xml" />
12
Vertaling Hibernate naar OO
13
Vertaling van de DB naar OO Primary keys
Kritische issues Primary key van DB niet bruikbaar vanwege meerdere instanties in sessies Oplossing Primary keys worden vervangen door HASH codes per instantiëring van een DAO
14
Vertaling van de DB naar OO Relaties
Vertaling relatie Relatie in DB wordt referentie in OO Type relaties in OO One to one Een referentie naar andere DAO One to many List in klasse Set: Voorbeeld volgt later Bag Many to many Ter vervanging van transitie tabel in DB de DAO houden elk set van referenties bii van elkaar => voorbeeld volgt later
15
Vertaling van de DB naar OO Relaties
Kritische issues Relaties in DB zijn bi-directioneel en moeilijk te implementeren in OO Bi directionele relaties in OO blijven kritisch en moeten vermeden worden waar mogelijk Relaties in onze applicatie Bi-directioneel: Read Uni-directioneel: Up-date
16
Vertaling van de DB naar OO Relaties (voorbeeld 1)
Mapping one-to-many <set name="employees" inverse="true" cascade="all" lazy="true" <key> <column name="Categoryid" /> </key> <one-to-many class="jproject02.database.hibernate.Employees" /> </set> Declaratie in DAO category private Set<IDB_Employee> employees = new HashSet<IDB_Employee>(0);
17
Vertaling van de DB naar OO Relaties (voorbeeld 2)
Mapping many to many Project: <set name="attachments" table="ProjectAttachment" cascade="all" lazy="true"> <key column="Projectsid" /> <many-to-many column="Attachmentsid" class="jproject02.database.hibernate.Attachments" /> </set> Attachment: <set name="projects" table="projectattachment" inverse="true" cascade="all" lazy="true"> <key column="Attachmentsid" /> <many-to-many column="Projectsid" class="jproject02.database.hibernate.Projects" />
18
Hibernate & Fetching strategieën
Hibernate ondersteunt volgende fetching strategieën Join fetching Select fetching Subselect fetching Batch fetching Immediate fetching Proxy fetching Lazy attribute fetching Lazy collection fetching
19
Lazy fetching Waar mogelijk gekozen voor lazy fetching
Values in een collectie blijven null tot informatie wordt opgevraagd Optimaliseert de query Vb <set name="modules" lazy="true" cascade="all"> <key column="Projectsid" /> <one-to-many class="jproject02.database.hibernate.Modules"/> </set>
20
Van Hibernate naar Model
21
Hibernate & Querying 3 opties Querying in onze applicatie Methods
Criteria Plain SQL (Te vermijden, hiermee gaat kracht Hibernate verloren) Querying in onze applicatie Criteria werd gebruikt als querying mechanisme => Informatie toegankelijker in API
22
Hibernate & Querying Voorbeeld Criteria
Criteria: DAO selecteren Restrictions: informatie filteren vgl. where clausule public List<IDB_Project> getAllProjects() { log.debug("getting projects"); try { Criteria crit = sessionFactory.getCurrentSession().createCriteria(Projects.class); crit.add(Restrictions.not(Restrictions.like("state", ProjectStates.CLOSED, MatchMode.ANYWHERE))); crit.addOrder(Order.desc("startdate")); return crit.list();
23
CRUD – Create Read Update Delete
Om DAO objecten aan te maken wordt gebruik gemaakt van DAO factory Voorbeeld implementatie Create in onze applicatie public class DAO_Factory { public static Object getDAO(Tables table) throws InstantiationException, IllegalAccessException, ClassNotFoundException { returnClass.forName(table.getPersistentClass()).newInstance(); }} Read Om DAO objecten te lezen wordt gebruik gemaakt van methodes van de CRUD klasse public List<IDB_Category> getAllCategories() { log.debug("getting categories"); try { Criteria crit = sessionFactory.getCurrentSession().createCriteria(Category.class); return crit.list();
24
CRUD – Create Read Update Delete
Property wordt gewijzigd in persistent object, zodra deze wordt gecommit, wordt de record in de database ge-update Delete “delete” van een persistent object wordt rechtstreeks aangeroepen op de sessie; sessionFactory.getCurrentSession().delete(persistentObject);
25
Controller Elke DAO gaat een interface implementeren. Deze is beschikbaar gesteld aan het model (contract) Voorbeeld Controller geimplementeerd in onze applicatie
26
Debugging
27
Loggen Log4J Configuratie Libraries Sample output
log4j.appender.stdout=org.apache.log4j.ConsoleAppender log4j.appender.stdout.Target=System.out log4j.appender.stdout.layout=org.apache.log4j.PatternLayout log4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE} ?%5p %c{1}:%L - %m%n # Root logger option log4j.rootLogger=INFO, stdout # Hibernate logging options (INFO only shows startup messages) log4j.logger.org.hibernate=INFO # Log JDBC bind parameter runtime arguments log4j.logger.org.hibernate.type=INFO Libraries Jcl Sample output Hibernate: select this_.id as id18_0_, this_.type as type18_0_, this_.classification as classifi3_18_0_, this_.wage as wage18_0_ from jproject02.skills this_
28
Conclusies Hibernate voldoet aan de vooropgestelde doeleinden
Reference Guide en Community zijn dermate uitgebreid dat men soms lang kan zoeken naar een specifiek weinig voorkomend probleem, doch leert de ervaring dat Community documentatie fundamenteel zal worden in efficiënt implementeren van nieuwe frameworks. Na de initiële leercurve komt Hibernate goed tot zijn recht en wordt zijn nut en zijn aandeel in de vereenvoudiging van het geheel duidelijk
Verwante presentaties
© 2024 SlidePlayer.nl Inc.
All rights reserved.