Κατανεµηµένα Συστήµατα ΙΙ 2008-0909 Hibernate Lecture Κλεοπάτρα Χατζηπρίµου (chatzipr@ceid.upatras.gr)
Τι είναι το Hibernate?(1/3) Ένα τυπικό Java Application αποτελείται από δύο ειδών objects: transient objects:η Η διάρκεια ζωής τους φράσσεται από την διάρκεια ζωής της διεργασίας δηµιουργού τους. persistent objects: outlive την διεργασία δηµιουργό.
Τι είναι το Hibernate?(2/3) Το Hibernate αποτελεί object-relational mapping tool (ORM) που επιτρέπει την ύπαρξη persisting java objects &query services σε relational databases. ΓΕΝΙΚΑ Η συνεκτικότητα των δεδοµένων διαµορφώνεται µε χρήση XML configuration files. Τα database tables αντιστοιχίζονται σε java classes. εναποτελεί SQL/Java code generation tool!
Τι είναι το Hibernate?(3/3) Αποτελεί ισχυρό εργαλείο, µε υψηλή απόδοση & αποτελεσµατικότητα. Επιτρέπει τη δηµιουργία persistent classes µε όλα τα object- oriented χαρακτηριστικά, συµπεριλαµβανοµένων των association, inheritance & polymorphism
Γιατί Hibernate? ιαχειρίζεται όλα τα create-read read-update-delete delete Operations, χρησιµοποιώντας απλό API, όχι SQL ηµιουργεί DDL scripts για τη δηµιουργία DB schema Ευελιξία στην συγγραφή SQL και κλήση αποθηκευµένων διαδικασιών για optimization της απόδοσης Υποστηρίζει πάνω από 20 RDBMS (Relational Database Management System). Η βάση µπορεί να αλλάξει µε απλή αλλαγή στο χρησιµοποιούµενο configuration file. Μειώνει σηµαντικά το χρόνο συγγραφής κώδικα
JDBC (1/2) Η συνηθισµένη λύση για database connectivity σε Java είναι το JDBC API (Java Database Connectivity): Επιτρέπει στους developers σύνδεση, queries, και update στη βάση δεδοµένων χρησιµοποιώντας SQL. Επιτρέπει interaction µε διαφορετικά RDBMS, όπως και πρόσβαση στα tables από Java Applications χωρίς να είναι απαραίτητη η γνώση RDBMS details, µε απλή χρήση των database specific JDBC drivers.
JDBC (2/2) Το interaction του JDBC µε το RDBMS είναι απλό. Για να αποκτήσει πρόσβαση ένα application στη βάση χρειάζονται τα ακόλουθαβήµατα: Open connection to database Use JDBC driver to send SQL queries to database Process the results that are returned Close the connection.
JDBC Architecture (1/2) Το JDBC χρησιµοποιεί 2βασικές αρχιτεκτονικές για επικοινωνία µε τη βάση: A.Ο driver συνδέεται στη βάση και εκτελεί τα SQL statements. Τα αποτελέσµατα στέλνονται από τον driver στον driver manager & τελικά στο application. B. Ο JDBC driver επικοινωνεί µε τον ODBC driver. Ο ODBC driver εκτελεί τα SQL queries, τα αποτελέσµατα στέλνονται στον JDBC driver, στον driver manager και τελικά στο application
JDBC Architecture (2/2)
Interaction with RDBMS (1/2) Steps: Load driver. Open connection with database. Create JDBC Statement Object ( Contains SQL query). Execute statement witch returns resultsets. Process resultset. Close connection.
Παράδειγµα
Hibernate Architecture (1/2) Το Hibernate (σε αντίθεση µε JDBC) : Ανοίγει το ίδιο σύνδεση µε τη βάση. Μετατρέπει HQL (Hibernate Query Language) σε database specific statements. Παραλαµβάνει τα result sets. Εκτελεί mappingτων database specific data σε Java objects τα οποία χρησιµοποιούνται απευθείας από το application.
Hibernate Architecture (2/2) Το Hibernate διαβάζει διαβάζει το database specification από το αρχείο Hibernate properties. Βάσει αυτού, γίνεται αυτόµατο mapping για καθορισµένα Java Objects µε τη βοήθεια των δεδοµένων που δηλώνονται στο.hbm XML file.
Hibernate vs. JDBC (1/4) -Γιατί το Hibernate είναι καλύτερο από το JDBC? ουλεύοντας µε Object-Oriented Oriented software & Relational Database είναι πολύπλοκο taskµε το JDBC,γιατί εµφανίζεται mismatch ανάµεσα στον τρόπο αναπαράστασης των δεδοµένων σε objects και στον τρόπο που τα αντιλαµβάνεται η βάση. Έτσι ο προγραµµατιστής πρέπει να γράψει παραπάνω κώδικα για να αντιστοιχίσει τα δεδοµένα από relational model σε object model. Το πρόβληµα δεν εµφανίζεται στο Hibernate καθώς το mapping γίνεται αυτόµατα µε XML files. Η διαδικασία ονοµάζεται transparent persistence.
Hibernate vs. JDBC (2/4) Το JDBC υποστηρίζει µόνο native SQL. Είναι δουλειά του προγραµµατιστή να επιλέξει το πιο effective query / database access για να εκτελέσει συγκεκριµένο task. Το Hibernate παρέχει την πολύ αποδοτική Hibernate query language (ανεξάρτητη από τον τύπο DB) που έχει την ίδια σύνταξη µε SQL και υποστηρίζει polymorphic queries. Ακόµα παρέχει native SQL queries και επιλέγει τον πιο αποδοτικό τρόπο για τη διαχείριση της βάσης,σύµφωνα σύµφωνα µε το εκάστοτε application.
Hibernate vs. JDBC (3/4) Όταν χρησιµοποιείται JDBC, αλλαγή στη βάση δεδοµένων µεταφράζεται σε αλλαγή στη δοµή του κώδικα. Αντιθέτως, αλλαγές στην βάση, µε χρήση Hibernate µεταφράζονται δυναµικά στον Java κώδικα µε απλή τροποποίηση των XML properties files. Με το JDBC ο προγραµµατιστής αναλαµβάνει να µετατρέψει χειροκίνητα resultsets σε Java Objects. Το Hibernate, γλιτώνει χρόνο, κόστος, και συντοµεύει τον απαιτούµενο κώδικα, διατηρώντας object-table table mapping & επιστρέφοντας τα αποτελέσµατα στο application σε µορφή Java Objects.
Hibernate vs. JDBC (4/4) Το Hibernate είναι open-source. Εµφανίζει καλή κλιµάκωσηµε µε την αύξηση του όγκου των δεδοµένων και υψηλή αξιοπιστία. Υποστηρίζει database versioningδιευκολύνοντας την παράλληλη συγγραφή κώδικα από διαφορετικά άτοµα. Υποστηρίζει cashingµειώνοντας τη χρονοβόρα διαδικασία πρόσβασης στο δίσκο.
Basic Hibernate (1/8) Simple Object Model AuctionItem BId description successfullbid amount datetime type
Basic Hibernate (2/8) Plain Old Java Object Default constructor Identifier property Get/Set Collection property is an interface type
Basic Hibernate (3/8) XML Mapping File Readable Metadata Column/table mappings Key generation Fetching strategies
Mapping relationships Το hibernate προσφέρει ποικίλους τρόπους για την αντιστοίχιση των σχέσεων των mapping objects, ανάλογα µε την πολυπλοκότητά τους:
Mapping Collections Τα mappings µπορούν να κάνουν include <set>, <list>, <map>, <bag>, <array>, <primitive-array> Και να χρησιµοποιήσουν τα interfaces :
Basic Hibernate (4/8) Creating Objects Το mapping και η σύνδεση µε τη βάση χρησιµοποιούνται για τη δηµιουργία SessionFactory αντικειµένου.το SessionFactory αποτελεί thread-safe cache από compiled mappings για µια βάση. ηµιουργείται µόνο µια φορά, στην αρχή του application (expensive). Το session δηλώνει την επικοινωνία βάσης application, και κρατά το πρώτο επίπεδο cache των αντικειµένων.
Basic Hibernate (5/8) Creating Objects (Transaction : atomic unit of work)
Basic Hibernate (6/8) Updating Objects
Basic Hibernate (7/8) Deleting Objects
Basic Hibernate (8/8) Selecting Objects
Hibernate Configuration Το configuration µπορεί να γίνει µε χρήση XML. Υπάρχουν πολλοί τρόποι για να συµπεριληφθούν mapping files στο configuration, όπως XML-based ή API-based.
Hibernate Session (1/2) Εφόσον έχει δηµιουργηθεί το configuration file, το sessionfactory µπορεί πια να γίνει generated:
Hibernate Session (2/2) Τυπικός κώδικας χρήσης του session object:
HQL(1/3) Η σύνταξη της HQL είναι παρόµοια µε της SQL. Αντίθετα µε την SQL, είναι database-agnostic. agnostic. Καταλαβαίνει κληρονοµικότητα, πολυµορφισµό, associations, aggregations, compositions Παρέχει Java-based API για τη δηµιουργία queries. Τα παραγόµενα queries είναι αποτελεσµατικά, διότι χρησιµοποιούν conditional logic, αποφεύγοντας messy string manipulation.
HQL (2/3)
HQL(3/3) HQL Examples
Απαιτούµενα Jars
Spring FrameWork Το Spring προσφέρει την HibernateSupportDao class η οποία παρέχει µεθόδους για exception handling.
Other tool support XDoclet: code generator, ο οποίος χρησιµοποιώντας javadoc tags παράγει hibernate mappings & language definitions από δεδοµένο πηγαίο κώδικα. MiddleGen: : code generator πουδηµιουργεί mappings & objects από δεδοµένη βάση andromda: : code generator framework παρακολουθεί το model driven architecture (MDA) paradigm.
Μειονεκτήµατα Hibernate (1/2) Χαµηλό learning curve Η χρήση Hibernate µπορεί να προκαλέσει overhead σε εφαρµογές που : -είναι απλές & χρησιµοποιούν βάση που δεν πρόκειται να υποστεί αλλαγές - το µόνο που απαιτούν είναι η τοποθέτηση δεδοµένων στα tables, όχι extra SQL. -δεν υπάρχουν objects mapped σε δύο διαφορετικά tables. To Hibernate εισάγει extra layers και πολυπλοκότητα, έτσι για τις απλές εφαρµογές προτείνεται η χρήση JDBC.
Μειονεκτήµατα Hibernate (1/2) Η υποστήριξη του Hibernate στο Internet δεν είναι επαρκής Όποιος χρειάζεται να διατηρήσει applications που χρησιµοποιούν hibernate, θα πρέπει να µάθει hibernate Για πολύπλοκα δεδοµένα, το mapping από objects σε tables και αντίστροφα µειώνει την απόδοση απαιτώντας υψηλό χρόνο εν υποστηρίζει ορισµένα queries που προσφέρει το JDBC. (Για παράδειγµα δεν υποστηρίζει την τοποθέτηση multiple objects στο ίδιο table µε ένα query.)
Ευχαριστώ!