Διαδικτυακές Εφαρμογές Ενότητα 1: JPA Μιχάλας Άγγελος Βούρκας Δημήτριος Τμήμα Μηχανικών Πληροφορικής ΤΕ
Άδειες Χρήσης Το παρόν εκπαιδευτικό υλικό υπόκειται σε άδειες χρήσης Creative Commons. Για εκπαιδευτικό υλικό, όπως εικόνες, που υπόκειται σε άλλου τύπου άδειας χρήσης, η άδεια χρήσης αναφέρεται ρητώς. 2
Χρηματοδότηση Το παρόν εκπαιδευτικό υλικό έχει αναπτυχθεί στα πλαίσια του εκπαιδευτικού έργου του διδάσκοντα. Το έργο «Ανοικτά Ακαδημαϊκά Μαθήματα του ΤΕΙ Δυτικής Μακεδονίας και της Ανώτατης Εκκλησιαστικής Ακαδημίας Θεσσαλονίκης» έχει χρηματοδοτήσει μόνο τη αναδιαμόρφωση του εκπαιδευτικού υλικού. Το έργο υλοποιείται στο πλαίσιο του Επιχειρησιακού Προγράμματος «Εκπαίδευση και Δια Βίου Μάθηση» και συγχρηματοδοτείται από την Ευρωπαϊκή Ένωση (Ευρωπαϊκό Κοινωνικό Ταμείο) και από εθνικούς πόρους. 3
Java Persistence Application - JPA
Σκοποί ενότητας Σε αυτή την ενότητα παρουσιάζεται το Java Persistence Application programming Interface - API. 5
Περιεχόμενα ενότητας (1/2) Εισαγωγή. Οντότητες Entities. Querying Entities. Παράδειγμα. Συνοψίζοντας. 6
Περιεχόμενα ενότητας (2/2) Main Class. Persistent Unit για την Main Class. Επίλογος. 7
Εισαγωγή (1/4) Το JPA 1.0 (Java Persistence API) δημιουργήθηκε για να λύσει προβλήματα που έχουν να κάνουν με την διατήρηση των δεδομένων και για να δημιουργήσει μια γέφυρα ανάμεσα στον αντικειμενοστραφή προγραμματισμό και τα σχεσιακά μοντέλα όπως είναι οι βάσεις δεδομένων. 8
Εισαγωγή (2/4) Η έκδοση που υπάρχει αυτήν την στιγμή είναι η έκδοση 2.0. Μπορούμε να χρησιμοποιήσουμε το συγκεκριμένο API για πρόσβαση και χειρισμό σχεσιακών δεδομένων από το Enterprise Java Beans (EJBs), τα συστατικά μέρη που απαρτίζουν τις εφαρμογές Web και τις εφαρμογές Java SE. 9
Εισαγωγή (3/4) Μέσω του JPA μπορούμε να ανεξαρτητοποιηθούμε από την SQL. Όλες οι κλάσεις και τα σχόλια (Annotations) από το συγκεκριμένο ΑΡΙ υπάρχουν στο javax.persistence πακέτο. 10
Εισαγωγή (4/4) Τα κύρια στοιχεία του JPA είναι τα εξής. ORM που είναι ο μηχανισμός για να αντιστοιχίσουμε αντικείμενα με δεδομένα που βρίσκονται σε μια βάση δεδομένων. Ο AΡΙ διαχειριστής οντοτήτων μέσω του οποίου μπορούμε να λειτουργίες που σχετίζονται με την βάση δεδομένων όπως Εισαγωγή, Ανάγνωση, Ενημέρωση, Διαγραφή (CRUD Create, Read, Update, Delete). JPQL (Java Persistence Query Language) μέσου του οποίου μπορούμε να λάβουμε μέσω μιας αντικειμενοστραφούς γλώσσας ερωτήσεων. JTA (Java Transaction API) που μας παρέχει μηχανισμούς συναλλαγής (Transactions) και κλειδώματος (locking) για την περίπτωση που έχουμε ταυτόχρονη πρόσβαση στα δεδομένα. Σύνδεση της επιχειρηματικής λογικής και των αντικειμένων 11
Οντότητες Entities (1/9) Θα πρέπει να γίνει ένας σαφής διαχωρισμός ανάμεσα στα στιγμιότυπα αντικείμενων (Objects instances) και στις οντότητες (Entities). Ένα στιγμιότυπο ενός αντικείμενου για κάποιο χρονικό διάστημα στην μνήμη του υπολογιστή, ενώ μια οντότητα είναι ένα αντικείμενο το οποίο υπάρχει για κάποιο διάστημα στην μνήμη του υπολογιστή, αλλά και μόνιμα αποθηκευμένο σε κάποια βάση δεδομένων. 12
Οντότητες Entities (2/9) Μια οντότητα μπορούμε να την αποθηκεύσουμε, να την διαγράψουμε και να την διαχειριστούμε χρησιμοποιώντας την γλώσσα ερωτημάτων JPQL. Η αντιστοίχιση ενός αντικειμένου με τον πίνακα της βάσης δεδομένων, γίνεται χρησιμοποιώντας metadata. 13
Οντότητες Entities (3/9) Τα metadata μπορούν να γραφτούν με δύο διαφορετικούς τρόπους. Annotations: o κώδικας της οντότητας σχολιάζεται κατευθείαν χρησιμοποιώντας annotations που περιγράφονται στο πακέτο javax.persistence. Extensible Markup Language (XML) descriptors: αντί την χρήση annotations μπορούμε να κάνουμε χρήση ενός XML αρχείου. 14
Οντότητες Entities (4/9) Ας δούμε ένα παράδειγμα για να κατανοήσουμε τα όσα έχουμε πει έως τώρα. Σύμφωνα με τα όσα γνωρίζετε μέχρι τώρα θα δημιουργήσουμε την κλάση Customer. Σχήμα 1. Δημιουργία κλάσης Custormer. 15
Οντότητες Entities (5/9) Εάν σε κάποια βάση δεδομένων υπάρχει ένας πίνακας CUSTOMER τότε θα πρέπει να χαρακτηρίσουμε την Customer σαν Entity και να την αντιστοιχίσουμε στον πίνακα της βάσης δεδομένων. 16
Οντότητες Entities (6/9) Mapping. Σχήμα 2. Mapping. 17
Οντότητες Entities (7/9) Το πρώτο πράγμα που θα πρέπει να κάνουμε είναι να σχολιάσουμε την κλάση σαν Entity. Αυτό γίνεται χρησιμοποιώντας το σχόλιο @Entity πριν να ορίσουμε την κλάση. 18
Οντότητες Entities (8/9) Στην συνέχεια θα πρέπει να ορίσουμε το πρωτεύον κλειδί χρησιμοποιώντας στο σχόλιο @Id και @GeneratedValue για να δηλώσουμε ότι το κλειδί παίρνει αυτόματα τιμές από την βάση δεδομένων και τέλος να ορίσουμε κάποια πεδία που μπορεί να μην είναι προαιρετικά, ή κάποια αλφαριθμητικά πεδία που έχουν διαφορετικό μέγεθος από το 255, χρησιμοποιώντας το σχόλιο @Column. 19
Οντότητες Entities (9/9) Μετά από τα προαναφερθέντα η κλάση διαμορφώνεται ως εξής. Σχήμα 3.Διαμορφωμένη κλάση. 20
Querying Entities (1/5) Όπως προαναφέρθηκε το JPA μας παρέχει την δυνατότητα να εκτελούμε λειτουργίες CRUD (Create, Read, Update, Delete) πάνω στις οντότητες, αλλά και να εκτελούμε σύνθετα ερωτήματα χρησιμοποιώντας την γλώσσα ερωτημάτων JPQL. Ο διαχειριστής οντοτήτων είναι ένα interface του οποίου η υλοποίηση έχει γίνει από το EclipseLink. 21
Querying Entities (2/5) Στον κώδικα που ακολουθεί μπορούμε να δούμε πως μπορούμε να δημιουργήσουμε έναν διαχειριστεί οντοτήτων και να αποθηκεύσουμε κάποιον πελάτη στην βάση δεδομένων. 22
Querying Entities (3/5) Στην επόμενη διαφάνεια μπορούμε να δούμε πως το interface του διαχειριστή οντοτήτων (EntityManager) μπορεί να χρησιμοποιηθεί για διαχειρισθεί οντότητες. Χρησιμοποιώντας τις μεθόδους persist() και find() ο διαχειριστής οντοτήτων κρύβει τις κλήσεις JDBC στην βάση δεδομένων καθώς και τις SQL δηλώσεις INSERT ή SELECT. 23
Querying Entities (4/5) Σχήμα 4. Querying Entities. 24
Querying Entities (5/5) Στην συνέχεια θα δούμε πως μπορούμε να εκτελέσουμε ερωτήματα χρησιμοποιώντας JPQL. Οι τύποι ερωτημάτων μπορεί να είναι τριών ειδών. Δυναμικά ερωτήματα, τα οποία δημιουργούνται δυναμικά κατά τον χρόνο εκτέλεσης. Στατικά, τα οποία δημιουργούνται κατά τον χρόνο εκτέλεσης. SQL ερωτήματα. 25
Παράδειγμα (1/3) Έστω ότι θέλουμε να βρούμε τα στοιχεία ενός πελάτη δίνοντας τον τηλεφωνικό του αριθμό. Αρχικά θα πρέπει να χρησιμοποιήσουμε το σχόλιο @NamedQuery ανάμεσα από το σχόλιο @Entity και τον ορισμό της κλάσης. Στη συνέχεια θα πρέπει να δώσουμε ένα όνομα και να συντάξουμε το ερώτημα. 26
Παράδειγμα (2/3) Σύμφωνα με τα προαναφερθέντα ο κώδικας της κλάσης γίνεται. Σχήμα 5. Ο κώδικας της κλάσης. 27
Παράδειγμα (3/3) Κάτι που θα πρέπει να τονίσουμε είναι ότι όταν διαγράφουμε μία οντότητα από την βάση δεδομένων με χρήση της μεθόδου EntityManager.remove( ). Το στιγμιότυπο του αντικειμένου συνεχίζει να υπάρχει στην μνήμη μέχρι να συλλεχθεί από τον συλλέκτη σκουπιδιών. 28
Συνοψίζοντας (1/2) Γνωρίζοντας για το JPA, τις οντότητες, τον διαχειριστή οντοτήτων και την γλώσσα ερωτημάτων JPQL θα γράψουμε μια μικρή εφαρμογή η οποία θα καταχωρεί το όνομα ενός πελάτη στην βάση δεδομένων. Στην κλάση Customer θα πρέπει να δημιουργήσουμε και τις κατάλληλες μεθόδους getters and setters, αλλά και τους constructors της κλάσης. 29
Συνοψίζοντας (2/2) Σχήμα 6. Συνοπτικά ο κώδικας. 30
Main Class (1/2) Η κλάση Main θα δημιουργήσει ένα στιγμιότυπο από την οντότητα Customer και θα εισάγει δεδομένα στις μεταβλητές. Αυτό που θα πρέπει να προσέξουμε είναι η χρήση της κλάσης Persistence για την δημιουργία ενός στιγμιότυπου EntityManagerFactory. Αναφέρεται στο MyEntityPU του οποίου η περιγραφή θα γίνει στην συνέχεια. 31
Main Class (2/2) Σχήμα 7. Main class. 32
Persistent Unit για την Main Class (1/4) Όπως προαναφέραμε η EntityManagerFactory αναφέρεται στην MyEntityPU το όνομα της οποίας αναφέρεται μέσα στο αρχείο persistence.xml το οποίο υπάρχει μέσα στον κατάλογο META-INF. Το xml αυτό αρχείο έχει πληροφορίες σχετικά με την βάση δεδομένων όπως την διεύθυνση δικτύου του Database Server, το όνομα της βάσης δεδομένων, το όνομα και τον κωδικό χρήστη. 33
Persistent Unit για την Main Class (2/4) Σχήμα 8. Persistent unit για τη Main Class. 34
Persistent Unit για την Main Class (3/4) Επίσης υπάρχει η δυνατότητα να τροποποιήσουμε το persistence.xml. Ώστε να υπάρχει η δυνατότητα δημιουργίας της βάσης δεδομένων σε περίπτωση που δεν υπάρχει. Η επόμενη διαφάνεια δείχνει τις αλλαγές που έγιναν στο αρχείο persistence.xml. 35
Persistent Unit για την Main Class (4/4) Σχήμα 9. Persistent unit για τη Main Class μετά από τις αλλαγές. 36
Επίλογος Όπως είδαμε το JPA μας διευκολύνει στο να απαλλαγούμε από την SQL και την βάση δεδομένων και να επικεντρωθούμε στην αντικειμενοστραφή ανάπτυξη λογισμικού. Βέβαια δεν είναι δυνατόν να αναφερθούμε σε όλες τις δυνατότητες του JPA. Όποιος ενδιαφέρεται να μάθει περισσότερα θα μπορούσε να δει το βιβλίο: Pro JPA 2, Mastering the Java TM Persistence API Mike Keith and Merrick Schnicariol. 37
Βιβλιογραφία 1. Java προγραμματισμός, Όγδοη έκδοση, Deitel Paul J., Deitel Harvey M., Εκδόσεις Γκιούρδας Μ.. 2. «Προγραμματισμός Internet και World Wide Web», Deitel Paul J., Deitel Harvey M., Εκδόσεις Γκιούρδας Μ.. 3. «Πλήρες εγχειρίδιο της Java 6», Lemay C, Εκδόσεις Γκιούρδας Μ., Αθήνα 2007. 38
Τέλος Ενότητας