Προγραμματισμός

Τι είναι το JPA; Εισαγωγή στο Java Persistence API

Ως προδιαγραφή, το Java Persistence API ασχολείται με επιμονή, που σημαίνει χαλαρά οποιονδήποτε μηχανισμό με τον οποίο τα αντικείμενα Java επιβιώνουν από τη διαδικασία εφαρμογής που τα δημιούργησε. Δεν πρέπει να διατηρηθούν όλα τα αντικείμενα Java, αλλά οι περισσότερες εφαρμογές διατηρούν βασικά επιχειρηματικά αντικείμενα. Η προδιαγραφή JPA σας επιτρέπει να ορίσετε οι οποίες τα αντικείμενα πρέπει να διατηρηθούν και πως αυτά τα αντικείμενα πρέπει να διατηρηθούν στις εφαρμογές Java.

Από μόνη της, το JPA δεν είναι εργαλείο ή πλαίσιο. Αντίθετα, ορίζει ένα σύνολο εννοιών που μπορούν να εφαρμοστούν από οποιοδήποτε εργαλείο ή πλαίσιο. Ενώ το μοντέλο αντιστοίχισης αντικειμενικής αντιστοίχισης (ORM) της JPA βασίστηκε αρχικά στο Hibernate, έκτοτε έχει εξελιχθεί. Παρομοίως, ενώ το JPA προοριζόταν αρχικά για χρήση με σχεσιακές / SQL βάσεις δεδομένων, ορισμένες εφαρμογές JPA έχουν επεκταθεί για χρήση με NoSQL datastores. Ένα δημοφιλές πλαίσιο που υποστηρίζει JPA με NoSQL είναι το EclipseLink, η εφαρμογή αναφοράς για το JPA 2.2.

JPA 2.2 στην Τζακάρτα ΕΕ

Το Java Persistence API κυκλοφόρησε για πρώτη φορά ως υποσύνολο της προδιαγραφής EJB 3.0 (JSR 220) στο Java EE 5. Έκτοτε εξελίχθηκε ως δική του προδιαγραφή, ξεκινώντας με την κυκλοφορία του JPA 2.0 στο Java EE 6 (JSR 317). Από αυτό το γράψιμο, το JPA 2.2 έχει υιοθετηθεί για συνέχεια ως μέρος της Τζακάρτα ΕΕ.

JPA και αδρανοποίηση

Λόγω της αλληλένδετης ιστορίας τους, το Hibernate και το JPA συχνά συμπλέκονται. Ωστόσο, όπως και η προδιαγραφή Java Servlet, το JPA έχει δημιουργήσει πολλά συμβατά εργαλεία και πλαίσια. Η αδρανοποίηση είναι μόνο ένα από αυτά.

Αναπτύχθηκε από τον Gavin King και κυκλοφόρησε στις αρχές του 2002, το Hibernate είναι μια βιβλιοθήκη ORM για Java. Ο King ανέπτυξε το Hibernate ως εναλλακτική λύση στα φασόλια οντοτήτων για επιμονή. Το πλαίσιο ήταν τόσο δημοφιλές, και ήταν τόσο απαραίτητο εκείνη τη στιγμή, ότι πολλές από τις ιδέες του υιοθετήθηκαν και κωδικοποιήθηκαν στην πρώτη προδιαγραφή JPA.

Σήμερα, το Hibernate ORM είναι μία από τις πιο ώριμες εφαρμογές JPA και εξακολουθεί να είναι μια δημοφιλής επιλογή για το ORM στην Java. Το Hibernate ORM 5.3.8 (η τρέχουσα έκδοση αυτού του γραψίματος) εφαρμόζει το JPA 2.2. Επιπλέον, η οικογένεια εργαλείων της Hibernate έχει επεκταθεί ώστε να περιλαμβάνει δημοφιλή εργαλεία όπως Hibernate Search, Hibernate Validator και Hibernate OGM, τα οποία υποστηρίζουν την επιμονή μοντέλου τομέα για το NoSQL.

JPA και EJB

Όπως σημειώθηκε νωρίτερα, το JPA εισήχθη ως υποσύνολο του EJB 3.0, αλλά έκτοτε έχει εξελιχθεί ως δική του προδιαγραφή. Το EJB είναι μια προδιαγραφή με διαφορετική εστίαση από το JPA και εφαρμόζεται σε ένα κοντέινερ EJB. Κάθε κοντέινερ EJB περιλαμβάνει ένα επίπεδο επιμονής, το οποίο καθορίζεται από την προδιαγραφή JPA.

Τι είναι το Java ORM;

Ενώ διαφέρουν στην εκτέλεση, κάθε υλοποίηση JPA παρέχει κάποιο είδος επιπέδου ORM. Για να κατανοήσετε τα εργαλεία που είναι συμβατά με το JPA και το JPA, πρέπει να έχετε καλή κατανόηση στο ORM.

Η αντιστοίχιση-σχεσιακής χαρτογράφησης είναι μια έργο–Ένα που οι προγραμματιστές έχουν καλό λόγο να αποφύγουν να κάνουν χειροκίνητα. Ένα πλαίσιο όπως το Hibernate ORM ή το EclipseLink κωδικοποιεί αυτή την εργασία σε μια βιβλιοθήκη ή πλαίσιο, ένα Επίπεδο ORM. Ως μέρος της αρχιτεκτονικής της εφαρμογής, το επίπεδο ORM είναι υπεύθυνο για τη διαχείριση της μετατροπής αντικειμένων λογισμικού για αλληλεπίδραση με τους πίνακες και τις στήλες σε μια σχεσιακή βάση δεδομένων. Στην Java, το επίπεδο ORM μετατρέπει τάξεις και αντικείμενα Java έτσι ώστε να μπορούν να αποθηκευτούν και να διαχειριστούν σε σχεσιακή βάση δεδομένων.

Από προεπιλογή, το όνομα του αντικειμένου που παραμένει γίνεται το όνομα του πίνακα και τα πεδία γίνονται στήλες. Μόλις ρυθμιστεί ο πίνακας, κάθε σειρά πίνακα αντιστοιχεί σε ένα αντικείμενο στην εφαρμογή. Η αντιστοίχιση αντικειμένων είναι διαμορφώσιμη, αλλά οι προεπιλογές τείνουν να λειτουργούν καλά.

JPA με NoSQL

Μέχρι πρόσφατα, οι μη σχετικές βάσεις δεδομένων ήταν ασυνήθιστες περιέργειες. Η κίνηση NoSQL άλλαξε όλα αυτά, και τώρα μια ποικιλία βάσεων δεδομένων NoSQL είναι διαθέσιμη για προγραμματιστές Java. Ορισμένες εφαρμογές JPA έχουν εξελιχθεί για να συμπεριλάβουν το NoSQL, συμπεριλαμβανομένων των Hibernate OGM και EclipseLink.

Το σχήμα 1 απεικονίζει το ρόλο του JPA και του στρώματος ORM στην ανάπτυξη εφαρμογών.

JavaWorld /

Διαμόρφωση του επιπέδου Java ORM

Όταν δημιουργείτε ένα νέο έργο για να χρησιμοποιήσετε το JPA, θα χρειαστεί να διαμορφώσετε το αρχείο δεδομένων και τον πάροχο JPA. Θα διαμορφώσετε ένα σύνδεσμος δεδομένων για να συνδεθείτε με την επιλεγμένη βάση δεδομένων (SQL ή NoSQL). Θα συμπεριλάβετε και θα διαμορφώσετε το Πάροχος JPA, το οποίο είναι ένα πλαίσιο όπως το Hibernate ή το EclipseLink. Παρόλο που μπορείτε να διαμορφώσετε το JPA με μη αυτόματο τρόπο, πολλοί προγραμματιστές επιλέγουν να χρησιμοποιήσουν την εξωτερική υποστήριξη της Spring. Βλέπω "Εγκατάσταση και ρύθμιση JPAπαρακάτω για μια επίδειξη τόσο της χειροκίνητης όσο και της εγκατάστασης JPA με βάση την άνοιξη.

Αντικείμενα δεδομένων Java

Τα Java Data Objects είναι ένα τυποποιημένο πλαίσιο επιμονής που διαφέρει από το JPA κυρίως υποστηρίζοντας τη λογική εμμονής στο αντικείμενο και από τη μακροχρόνια υποστήριξή του για εργασία με μη σχετικούς χώρους αποθήκευσης δεδομένων. Το JPA και το JDO είναι αρκετά παρόμοια ώστε οι πάροχοι JDO συχνά υποστηρίζουν επίσης το JPA. Δείτε το Apache JDO Project για να μάθετε περισσότερα για το JDO σε σχέση με άλλα πρότυπα επιμονής όπως το JPA και το JDBC.

Διατήρηση δεδομένων στην Java

Από προοπτική προγραμματισμού, το επίπεδο ORM είναι ένα στρώμα προσαρμογέα: προσαρμόζει τη γλώσσα των γραφημάτων αντικειμένων στη γλώσσα των SQL και σχεσιακών πινάκων. Το επίπεδο ORM επιτρέπει στους αντικειμενοστρεφείς προγραμματιστές να δημιουργούν λογισμικό που διατηρεί δεδομένα χωρίς να αφήνει ποτέ το αντικειμενοστρεφές παράδειγμα.

Όταν χρησιμοποιείτε το JPA, δημιουργείτε ένα χάρτης από το αρχείο δεδομένων έως τα αντικείμενα του μοντέλου δεδομένων της εφαρμογής σας. Αντί να ορίζετε τον τρόπο αποθήκευσης και ανάκτησης αντικειμένων, ορίζετε την αντιστοίχιση μεταξύ αντικειμένων και της βάσης δεδομένων σας και, στη συνέχεια, καλείτε το JPA να τα διατηρήσει. Εάν χρησιμοποιείτε μια σχεσιακή βάση δεδομένων, μεγάλο μέρος της πραγματικής σύνδεσης μεταξύ του κώδικα της εφαρμογής σας και της βάσης δεδομένων θα χειριστεί τότε από το JDBC, το Java Database Connectivity API.

Ως προδιαγραφή, το JPA παρέχει σχολιασμοί μεταδεδομένων, την οποία χρησιμοποιείτε για να ορίσετε την αντιστοίχιση μεταξύ αντικειμένων και βάσης δεδομένων. Κάθε υλοποίηση JPA παρέχει τη δική της μηχανή για σχολιασμούς JPA. Η προδιαγραφή JPA παρέχει επίσης το PersistanceManager ή EntityManager, τα οποία είναι τα βασικά σημεία επαφής με το σύστημα JPA (όπου ο κωδικός λογικής της επιχείρησής σας λέει στο σύστημα τι να κάνει με τα αντιστοιχισμένα αντικείμενα).

Για να κάνετε όλα αυτά πιο συγκεκριμένα, σκεφτείτε τη Λίστα 1, η οποία είναι μια απλή κατηγορία δεδομένων για τη μοντελοποίηση ενός μουσικού.

Λίστα 1. Μια απλή κατηγορία δεδομένων στην Java

 μουσικός δημόσιας τάξης {ιδιωτικό Long id; ιδιωτικό όνομα συμβολοσειράς; ιδιωτικό όργανο mainInstrument; ιδιωτικές παραστάσεις ArrayList = νέο ArrayList (); δημόσιος μουσικός (Long id, String name) {/ * setors setor ... * /} public void setName (String name) {this.name = name; } δημόσια συμβολοσειρά getName () {return this.name; } public void setMainInstrument (Instrument instr) {this.instrument = instr; } δημόσιο μέσο GetMainInstrument () {return this.instrument; } // ... Άλλοι παραλήπτες και ρυθμιστές ...} 

ο Μουσικός τάξη στην καταχώριση 1 χρησιμοποιείται για τη συγκράτηση δεδομένων. Μπορεί να περιέχει πρωτόγονα δεδομένα όπως το όνομα πεδίο. Μπορεί επίσης να διατηρεί σχέσεις με άλλες τάξεις όπως mainInstrument και παραστάσεις.

Μουσικός'μικρό λόγος για να είσαι είναι να περιέχει δεδομένα. Αυτός ο τύπος τάξης είναι μερικές φορές γνωστός ως DTO, ή αντικείμενο μεταφοράς δεδομένων. Τα DTO είναι ένα κοινό χαρακτηριστικό της ανάπτυξης λογισμικού. Ενώ διατηρούν πολλά είδη δεδομένων, δεν περιέχουν επιχειρηματική λογική. Η επιμονή αντικειμένων δεδομένων είναι μια πανταχού παρούσα πρόκληση στην ανάπτυξη λογισμικού.

Διατήρηση δεδομένων με JDBC

Ένας τρόπος για να αποθηκεύσετε μια παρουσία του Μουσικός κλάση σε μια σχεσιακή βάση δεδομένων θα ήταν η χρήση της βιβλιοθήκης JDBC. Το JDBC είναι ένα επίπεδο αφαίρεσης που επιτρέπει σε μια εφαρμογή να εκδίδει εντολές SQL χωρίς να σκέφτεται την υποκείμενη εφαρμογή της βάσης δεδομένων.

Η λίστα 2 δείχνει πώς θα μπορούσατε να επιμείνετε στο Μουσικός τάξη χρησιμοποιώντας JDBC.

Λίστα 2. JDBC εισαγωγή μιας εγγραφής

 Μουσικός georgeHarrison = νέος μουσικός (0, "George Harrison"); Συμβολοσειρά myDriver = "org.gjt.mm.mysql.Driver"; Συμβολοσειρά myUrl = "jdbc: mysql: // localhost / test"; Class.forName (myDriver); Connection conn = DriverManager.getConnection (myUrl, "root", ""); String query = "εισαγωγή σε τιμές χρηστών (id, name) (?,?)"; PreparedStatement readyStmt = conn.prepareStatement (ερώτημα); readyStmt.setInt (1, 0); προετοιμασίαStmt.setString (2, "George Harrison"); προετοιμασίαStmt.setString (2, "Rubble"); readyStmt.execute (); conn.close (); // Ο χειρισμός σφαλμάτων καταργήθηκε για συντομία 

Ο κωδικός στην Λίστα 2 είναι αρκετά αυτο-τεκμηριωμένος. ο george Χάρισον το αντικείμενο θα μπορούσε να προέρχεται από οπουδήποτε (υποβολή front-end, εξωτερική υπηρεσία κ.λπ.) και έχει ορίσει τα πεδία ταυτότητας και ονόματος. Τα πεδία στο αντικείμενο χρησιμοποιούνται στη συνέχεια για την παροχή των τιμών μιας SQL εισάγετε δήλωση. (Ο Προετοιμασμένη δήλωση Η κλάση είναι μέρος του JDBC, προσφέροντας έναν τρόπο για την ασφαλή εφαρμογή τιμών σε ένα ερώτημα SQL.)

Ενώ το JDBC επιτρέπει τον έλεγχο που συνοδεύει τη μη αυτόματη διαμόρφωση, είναι δυσκίνητο σε σύγκριση με το JPA. Για να τροποποιήσετε τη βάση δεδομένων, πρέπει πρώτα να δημιουργήσετε ένα ερώτημα SQL που αντιστοιχεί από το αντικείμενο Java στους πίνακες μιας σχεσιακής βάσης δεδομένων. Στη συνέχεια, πρέπει να τροποποιήσετε το SQL κάθε φορά που αλλάζει μια υπογραφή αντικειμένου. Με το JDBC, η διατήρηση του SQL γίνεται από μόνη της μια εργασία.

Διατήρηση δεδομένων με JPA

Τώρα σκεφτείτε την καταχώριση 3, όπου εμείς επιμένουμε Μουσικός τάξη χρησιμοποιώντας JPA.

Λίστα 3. Επίμονος George Harrison με το JPA

 Μουσικός georgeHarrison = νέος μουσικός (0, "George Harrison"); musicianManager.save (georgeHarrison); 

Η Λίστα 3 αντικαθιστά το μη αυτόματο SQL από την Καταχώριση 2 με μία μόνο γραμμή, session.save (), που δίνει εντολή στο JPA να διατηρήσει το αντικείμενο. Από τότε και στο εξής, η μετατροπή SQL αντιμετωπίζεται από το πλαίσιο, οπότε δεν χρειάζεται ποτέ να αφήσετε το αντικειμενοστρεφό παράδειγμα.

Σχολιασμοί μεταδεδομένων στο JPA

Η μαγεία στην καταχώριση 3 είναι το αποτέλεσμα ενός διαμόρφωση, το οποίο δημιουργείται χρησιμοποιώντας τους σχολιασμούς του JPA. Οι προγραμματιστές χρησιμοποιούν σχολιασμούς για να ενημερώσουν το JPA ποια αντικείμενα πρέπει να διατηρηθούν και πώς πρέπει να διατηρηθούν.

Η λίστα 4 δείχνει το Μουσικός τάξη με έναν μόνο σχολιασμό JPA.

Λίστα 4. Σχολιασμός @Entity της JPA

 @Entity δημόσια τάξη Μουσικός {// ..class body} 

Μερικές φορές ονομάζονται επίμονα αντικείμενα οντότητες. Επισύναψη @Οντότητα σε μια τάξη σαν Μουσικός ενημερώνει την JPA ότι αυτή η τάξη και τα αντικείμενά της πρέπει να διατηρηθούν.

Διαμόρφωση XML έναντι σχολιασμού

Το JPA υποστηρίζει επίσης τη χρήση εξωτερικών αρχείων XML, αντί για σχολιασμούς, για τον καθορισμό μεταδεδομένων κλάσης. Αλλά γιατί θα το κάνατε αυτό στον εαυτό σας;

Διαμόρφωση JPA

Όπως τα περισσότερα σύγχρονα πλαίσια, το JPA αγκαλιάζει κωδικοποίηση βάσει σύμβασης (επίσης γνωστό ως σύμβαση σχετικά με τη διαμόρφωση), στο οποίο το πλαίσιο παρέχει μια προεπιλεγμένη διαμόρφωση με βάση τις βέλτιστες πρακτικές του κλάδου. Ως ένα παράδειγμα, μια τάξη που ονομάζεται Μουσικός θα αντιστοιχιστεί από προεπιλογή σε έναν πίνακα βάσης δεδομένων που ονομάζεται Μουσικός.

Η συμβατική διαμόρφωση είναι εξοικονόμηση χρόνου και σε πολλές περιπτώσεις λειτουργεί αρκετά καλά. Είναι επίσης δυνατό να προσαρμόσετε τη διαμόρφωση JPA. Για παράδειγμα, θα μπορούσατε να χρησιμοποιήσετε JPA @Τραπέζι σχολιασμός για να καθορίσετε τον πίνακα όπου το Μουσικός η τάξη πρέπει να αποθηκευτεί.

Λίστα 5. Σχολιασμός @ πίνακα του JPA

 @Entity @Table (name = "musician") δημόσιας τάξης Μουσικός {// ..class body} 

Η λίστα 5 λέει στην JPA να διατηρήσει την οντότητα (Μουσικός τάξη) στο μουσικός τραπέζι.

Πρωτεύων κλειδί

Στο JPA, το πρωτεύων κλειδί είναι το πεδίο που χρησιμοποιείται για τον μοναδικό προσδιορισμό κάθε αντικειμένου στη βάση δεδομένων. Το πρωτεύον κλειδί είναι χρήσιμο για αναφορά και συσχέτιση αντικειμένων με άλλες οντότητες. Κάθε φορά που αποθηκεύετε ένα αντικείμενο σε έναν πίνακα, θα καθορίζετε επίσης το πεδίο που θα χρησιμοποιείται ως κύριο κλειδί του.

Στην λίστα 6, λέμε στον JPA ποιο πεδίο χρησιμοποιείται Μουσικόςπρωτεύον κλειδί.

Λίστα 6. Καθορισμός του πρωτεύοντος κλειδιού

 @Entity δημόσια τάξη Μουσικός {@Id ιδιωτικό Long id; 

Σε αυτήν την περίπτωση, χρησιμοποιήσαμε τα JPA @Ταυτότητα σχολιασμός για να καθορίσετε το ταυτότητα πεδίο ως Μουσικόςπρωτεύον κλειδί. Από προεπιλογή, αυτή η διαμόρφωση προϋποθέτει ότι το πρωτεύον κλειδί θα οριστεί από τη βάση δεδομένων - για παράδειγμα, όταν το πεδίο έχει ρυθμιστεί σε αυτόματη αύξηση στον πίνακα.

Το JPA υποστηρίζει άλλες στρατηγικές για τη δημιουργία του πρωτεύοντος κλειδιού ενός αντικειμένου. Έχει επίσης σχολιασμούς για την αλλαγή μεμονωμένων ονομάτων πεδίων. Γενικά, το JPA είναι αρκετά ευέλικτο ώστε να προσαρμόζεται σε οποιαδήποτε χαρτογράφηση επιμονής που μπορεί να χρειαστείτε.

Λειτουργίες CRUD

Μόλις αντιστοιχίσετε μια κλάση σε έναν πίνακα βάσης δεδομένων και καθορίσετε το κύριο κλειδί της, έχετε όλα όσα χρειάζεστε για να δημιουργήσετε, να ανακτήσετε, να διαγράψετε και να ενημερώσετε αυτήν την κλάση στη βάση δεδομένων. Κλήση session.save () θα δημιουργήσει ή θα ενημερώσει την καθορισμένη κλάση, ανάλογα με το αν το πεδίο πρωτεύοντος κλειδιού είναι μηδενικό ή ισχύει για την υπάρχουσα οντότητα. Κλήση entityManager.remove () θα διαγράψει την καθορισμένη τάξη.

Σχέσεις οντοτήτων στο JPA

Η απλή επιμονή ενός αντικειμένου με πρωτόγονο πεδίο είναι μόνο η μισή εξίσωση. Η JPA έχει επίσης τη δυνατότητα διαχείρισης οντοτήτων σε σχέση μεταξύ τους. Τέσσερα είδη σχέσεων οντοτήτων είναι δυνατά τόσο στους πίνακες όσο και στα αντικείμενα:

    1. Ένα προς πολλά
    2. Πολλά προς ένα
    3. Πολλά σε πολλά
    4. Ενα προς ένα

Κάθε τύπος σχέσης περιγράφει πώς μια οντότητα σχετίζεται με άλλες οντότητες. Για παράδειγμα, το Μουσικός οντότητα θα μπορούσε να έχει σχέση ενός προς πολλούς με Εκτέλεση, μια οντότητα που εκπροσωπείται από μια συλλογή όπως Λίστα ή Σειρά.

Εάν το Μουσικός περιλαμβάνονται ένα Ζώνη πεδίο, η σχέση μεταξύ αυτών των οντοτήτων θα μπορούσε να είναι πολλά προς ένα, υπονοούμενη συλλογή από Μουσικόςs στο single Ζώνη τάξη. (Υποθέτοντας ότι κάθε μουσικός αποδίδει μόνο σε μία μπάντα.)

Αν Μουσικός περιλαμβάνονται ένα Συνεργάτες πεδίο, που θα μπορούσε να αντιπροσωπεύει ένα σχέση πολλών προς πολλών με άλλα Μουσικός οντότητες.

Τελικά, Μουσικός μπορεί να έχει σχέση ενός προς έναν με Παραθέτω, αναφορά οντότητα, χρησιμοποιείται για να αντιπροσωπεύει ένα διάσημο απόσπασμα: Quote διάσημο Quote = νέο απόσπασμα ().

Καθορισμός τύπων σχέσεων

Το JPA έχει σχολιασμούς για καθέναν από τους τύπους χαρτογράφησης σχέσεων. Η λίστα 7 δείχνει πώς θα μπορούσατε να σχολιάσετε τη σχέση μεταξύ ενός προς πολλούς Μουσικός και Εκτέλεσημικρό.

Λίστα 7. Σχολιασμός μιας προς πολλούς σχέσης