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

Με λίγα λόγια, το EJB 3.0

Παρά τα πολλά θετικά, η πολυπλοκότητα της αρχιτεκτονικής Enterprise JavaBeans εμποδίζει την υιοθέτηση του J2EE. Η αρχιτεκτονική EJB είναι πιθανώς το μόνο συστατικό J2EE που έχει αποτύχει τόσο άσχημα στην εκπλήρωση της υπόσχεσης του J2EE για αυξημένη παραγωγικότητα προγραμματιστή, απόλυτη ευκολία ανάπτυξης. Το EJB 3.0 κάνει μια άλλη προσπάθεια να εκπληρώσει αυτήν την υπόσχεση μειώνοντας την πολυπλοκότητα του EJB για προγραμματιστές. Το EJB 3.0 μειώνει τον αριθμό των τεχνουργημάτων προγραμματισμού που παρέχουν οι προγραμματιστές, εξαλείφει ή ελαχιστοποιεί τις μεθόδους επανάκλησης που απαιτούνται για εφαρμογή και μειώνει την πολυπλοκότητα του μοντέλου προγραμματισμού φασολιών οντοτήτων και του μοντέλου χαρτογράφησης O / R.

Σε αυτό το άρθρο, καλύπτω πρώτα τις πιο σημαντικές αλλαγές στο EJB 3.0. Είναι σημαντικό να έχετε τα βασικά στοιχεία πριν από την κατάδυση στην πισίνα EJB 3.0. Στη συνέχεια, δίνω μια εικόνα υψηλού επιπέδου για το προσχέδιο EJB 3.0 και μετά μπαίνω σε λεπτομέρειες της προτεινόμενης προδιαγραφής, δίνοντας προσοχή σε όλες τις αλλαγές μία προς μία: αντίκτυπος σε τύπους φασολιών επιχειρήσεων, μοντέλο χαρτογράφησης O / R, οντότητα- μοντέλο σχέσης, EJB QL (EJB Query Language) κ.λπ.

Ιστορικό

Οι δύο πιο σημαντικές αλλαγές στην προτεινόμενη προδιαγραφή EJB 3.0 είναι η χρήση της εγκατάστασης σχολιασμού προγράμματος που εισήχθη στο Java 5 και το νέο μοντέλο χαρτογράφησης O / R που βασίζεται στο Hibernate.

Δυνατότητα μεταδεδομένων στην Java 5

Το Java 5 (παλαιότερα ονομαζόταν J2SE 1.5 ή Tiger) εισήγαγε μια νέα δυνατότητα σχολιασμού προγράμματος στη γλώσσα. Με αυτήν τη δυνατότητα, μπορείτε να ορίσετε προσαρμοσμένους σχολιασμούς και, στη συνέχεια, να σχολιάσετε πεδία, μεθόδους, τάξεις κ.λπ., με αυτούς τους σχολιασμούς. Οι σχολιασμοί δεν επηρεάζουν άμεσα τη σημασιολογία του προγράμματος, αλλά τα εργαλεία (χρόνος σύνταξης ή χρόνος εκτέλεσης) μπορούν να επιθεωρήσουν αυτούς τους σχολιασμούς για να δημιουργήσουν πρόσθετες κατασκευές (όπως ένας περιγραφέας ανάπτυξης) ή να επιβάλουν την επιθυμητή συμπεριφορά χρόνου εκτέλεσης (όπως η κατάσταση του στοιχείου EJB). Οι σχολιασμοί μπορούν να ελεγχθούν μέσω ανάλυσης πηγής (π.χ. μεταγλωττιστές ή εργαλεία IDE) ή χρησιμοποιώντας τα πρόσθετα API αντανάκλασης που προστέθηκαν στην Java 5. Οι σχολιασμοί μπορούν να οριστούν ότι είναι διαθέσιμοι μόνο στο επίπεδο του πηγαίου κώδικα, στο επίπεδο της μεταγλωττισμένης τάξης ή στο χρόνο εκτέλεσης . Όλοι οι σχολιασμοί που προτείνονται στο προσχέδιο EJB 3.0 έχουν α Πολιτική διατήρησης του ΔΙΑΔΙΚΑΣΙΑ. Αυτό αυξάνει οριακά το αποτύπωμα της μνήμης της τάξης, αλλά κάνει τη ζωή του παρόχου κοντέινερ και του παρόχου εργαλείων πολύ πιο εύκολη.

Ανατρέξτε στην ενότητα Πόροι για περαιτέρω ανάγνωση αυτού του θέματος.

Παραχειμάζω

Το Hibernate είναι ένα δημοφιλές πλαίσιο χαρτογράφησης ανοιχτού κώδικα O / R για περιβάλλοντα Java, το οποίο προορίζεται να προστατεύσει τους προγραμματιστές από τις πιο συνηθισμένες εργασίες προγραμματισμού που σχετίζονται με την επιμονή δεδομένων. Έχει επίσης μια συγκεκριμένη Hibernate Query Language (HQL), αποτυπώματα της οποίας μπορεί να δει στο νέο EJB QL. Το Hibernate προσφέρει διευκολύνσεις για την ανάκτηση και ενημέρωση δεδομένων, τη συγκέντρωση συνδέσεων, τη διαχείριση συναλλαγών, τη διαχείριση σχέσεων δηλωτικών οντοτήτων και τα ερωτήματα δηλώσεων και προγραμματισμού.

Θέα από ψηλά

Οι αλλαγές στην προτεινόμενη προδιαγραφή EJB 3.0 μπορούν να χωριστούν σε δύο κατηγορίες:

  • Ένα μοντέλο προγραμματισμού EJB που βασίζεται σε σχολιασμούς, Εκτός από το μοντέλο EJB 2.1 του καθορισμού της συμπεριφοράς μιας εφαρμογής μέσω περιγραφικών ανάπτυξης και πολλών διεπαφών.
  • Το νέο μοντέλο επιμονής για φασόλια οντότητας. Το EJB QL έχει επίσης αλλάξει σημαντικά.

Υπάρχουν επίσης πολλές παρενέργειες σε αυτές τις προτάσεις, όπως ένα νέο μοντέλο προγραμματισμού πελάτη, η χρήση επιχειρηματικών διεπαφών και ένας κύκλος ζωής οντότητας. Λάβετε υπόψη ότι το μοντέλο προγραμματισμού EJB 2.1 (με περιγραφές ανάπτυξης και οικιακές / απομακρυσμένες διεπαφές) εξακολουθεί να ισχύει. Το νέο απλοποιημένο μοντέλο δεν αντικαθιστά πλήρως το μοντέλο EJB 2.1.

Σχολιασμοί του EJB

Ένας από τους σημαντικούς στόχους της ομάδας εμπειρογνωμόνων είναι να μειώσει τον αριθμό των τεχνουργημάτων που πρέπει να παρέχει ένας πάροχος φασολιών και η ομάδα έχει κάνει αρκετά καλή δουλειά στην επίτευξη αυτού του στόχου. Στον κόσμο του EJB 3.0, όλα τα είδη φασολιών είναι απλά απλά παλιά αντικείμενα Java (POJO) με κατάλληλους σχολιασμούς. Οι σχολιασμοί μπορούν να χρησιμοποιηθούν για να καθορίσουν την επιχειρηματική διεπαφή του φασολιού, τις πληροφορίες χαρτογράφησης O / R, τις αναφορές πόρων και σχεδόν οτιδήποτε άλλο ορίστηκε μέσω περιγραφών ανάπτυξης ή διεπαφών στο EJB 2.1. Δεν απαιτούνται πλέον περιγραφές ανάπτυξης. η οικιακή διεπαφή έχει φύγει και δεν χρειάζεται απαραίτητα να εφαρμόσετε μια επιχειρηματική διεπαφή (το κοντέινερ μπορεί να το δημιουργήσει για εσάς).

Για παράδειγμα, δηλώνετε έναν κόμβο συνεδρίας χωρίς απάτη χρησιμοποιώντας το @Stateless σχολιασμός στην τάξη Java. Για κρατικά φασόλια, το @Αφαιρώ Ο σχολιασμός επισημαίνεται σε μια συγκεκριμένη μέθοδο για να υποδείξει ότι η παρουσία φασολιών πρέπει να αφαιρεθεί μετά την ολοκλήρωση μιας κλήσης στη μαρκαρισμένη μέθοδο.

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

Το νέο μοντέλο επιμονής

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

Οι σχέσεις οντοτήτων καθορίζονται επίσης μέσω σχολιασμών. Επιπλέον, η χαρτογράφηση O / R γίνεται επίσης μέσω σχολιασμών και παρέχεται υποστήριξη για διάφορες λειτουργίες που αφορούν συγκεκριμένες βάσεις δεδομένων. Με το EJB 2.1, οι προγραμματιστές χρησιμοποίησαν τα δικά τους σχέδια σχεδίασης ή χρησιμοποίησαν μη φορητές τεχνικές (για παράδειγμα, στρατηγικές αυτόματης δημιουργίας κλειδιών).

Σκάψιμο βαθιά

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

Φασόλια συνεδρίας ανιθαγενών:

Ένα κόμμα συνεδρίας χωρίς κατάσταση (SLSB), γραμμένο με τον τρόπο EJB 3.0, είναι απλώς ένα απλό αρχείο Java με σχολιασμό επιπέδου κλάσης @Stateless. Η κατηγορία φασολιών μπορεί να εφαρμόσει το javax.ejb.SessionBean διεπαφή, αλλά δεν απαιτείται (και συνήθως δεν θα).

Ένα SLSB δεν έχει πλέον οικιακή διεπαφή - στην πραγματικότητα, δεν απαιτείται τύπος EJB. Η κατηγορία φασολιών μπορεί ή όχι να εφαρμόσει μια επιχειρηματική διεπαφή. Εάν δεν εφαρμόζει επιχειρηματικές διεπαφές, θα δημιουργηθεί μια διεπαφή επιχείρησης χρησιμοποιώντας όλες τις δημόσιες μεθόδους. Εάν μόνο ορισμένες μέθοδοι πρέπει να εκτεθούν στην επιχειρηματική διεπαφή, όλες αυτές οι μέθοδοι μπορούν να επισημανθούν με το @BusinessMethod σχόλιο. Από προεπιλογή, όλες οι παραγόμενες διεπαφές είναι τοπικές, αλλά η @Μακρινός ο σχολιασμός μπορεί να χρησιμοποιηθεί για να δείξει ότι πρέπει να δημιουργηθεί μια απομακρυσμένη διεπαφή.

Οι ακόλουθες λίγες γραμμές κώδικα είναι αρκετές για να ορίσουν ένα Γειά σου Κόσμε φασόλι. Με το EJB 2.1, το ίδιο φασόλι θα απαιτούσε τουλάχιστον δύο διεπαφές, μία κλάση υλοποίησης με αρκετές κενές εφαρμογές μεθόδου και έναν περιγραφέα ανάπτυξης.

εισαγωγή javax.ejb. *; / ** * Ένα φασόλι περιόδου χωρίς απάτη που ζητά να δημιουργηθεί μια απομακρυσμένη διεπαφή επιχείρησης για αυτό. * / @Stateless @Remote δημόσια τάξη HelloWorldBean {public String sayHello () {return "Hello World !!!"; }} 

Ανατρέξτε στην ενότητα Πόροι για τον πλήρη πηγαίο κώδικα που συνοδεύει αυτό το άρθρο.

Stateful φασόλια συνεδρίας

Η ιστορία με τα stateful φασόλια συνεδρίας (SFSB) είναι σχεδόν η ίδια για το SLSB, εκτός από μερικά σημεία που αφορούν συγκεκριμένα το SFSB:

  • Ένα SFSB πρέπει να έχει έναν τρόπο αρχικοποίησης (παρέχεται μέσω του ejbCreate () μέθοδο στο EJB 2.1 και νωρίτερα). Η προδιαγραφή EJB 3.0 προτείνει ότι τέτοιες μέθοδοι προετοιμασίας παρέχονται ως προσαρμοσμένες μέθοδοι και εκτίθενται μέσω της επιχειρηματικής διεπαφής του φασολιού. Η ευθύνη εναπόκειται τώρα στον πελάτη να καλέσει τις κατάλληλες μεθόδους αρχικοποίησης πριν χρησιμοποιήσει το φασόλι. Η ομάδα εμπειρογνωμόνων εξακολουθεί να συζητά την ανάγκη παροχής σχολιασμού που σηματοδοτεί μια συγκεκριμένη μέθοδο αρχικοποίησης.
  • Ο πάροχος φασολιών μπορεί να επισημάνει οποιαδήποτε μέθοδο SFSB με το @Αφαιρώ σχολιασμός για να υποδείξει ότι η παρουσία φασολιών πρέπει να αφαιρεθεί μετά την κλήση της σχολιασμένης μεθόδου. Και πάλι, η ομάδα εμπειρογνωμόνων εξακολουθεί να συζητά εάν μια εγκατάσταση είναι απαραίτητη για να δείξει ότι το φασόλι δεν πρέπει να αφαιρεθεί εάν η μέθοδος δεν ολοκληρώνεται κανονικά.

Αυτή είναι η γνώμη μου για τα δύο ανοιχτά ζητήματα:

  • Πρέπει να υπάρχει σχολιασμός για τη μέθοδο προετοιμασίας; Η ψήφος μου είναι ναι - με την υπόθεση ότι το κοντέινερ θα διασφαλίσει ότι καλείται τουλάχιστον μία από τις μεθόδους προετοιμασίας πριν από την κλήση οποιασδήποτε άλλης επιχειρηματικής μεθόδου. Αυτό όχι μόνο προστατεύει από τυχαία λάθη προγραμματισμού, αλλά επίσης κάνει το κοντέινερ πιο σίγουρο για την επαναχρησιμοποίηση παρουσιών SFSB. Για λόγους σαφήνειας, επιτρέψτε μου να αναφέρω εδώ ότι όχι καθορισμένη αρχικοποίηση μεθόδους (όπως Δημιουργίαείναι υπό εξέταση · η ομάδα εμπειρογνωμόνων σκέφτεται να έχει μόνο ένα σχολιασμό ως μέθοδο αρχικοποίησης.
  • Πρέπει να είναι διαμορφώσιμο ότι ο μη φυσιολογικός τερματισμός του @Αφαιρώ η μέθοδος δεν αφαιρεί την παρουσία φασολιών; Και πάλι, η ψήφος μου είναι ναι. Θα δώσει καλύτερο έλεγχο μόνο στον πάροχο φασολιών και στους προγραμματιστές πελατών. Μένει μόνο μία ερώτηση: τι συμβαίνει σε αυτά τα φασόλια που έχουν χαρακτηριστεί ως δεν καταργήθηκε σε μια ανεπιτυχή κλήση στη μέθοδο κατάργησης και η μέθοδος κατάργησης μιας συγκεκριμένης παρουσίας δεν ολοκληρώνεται ποτέ με επιτυχία; Δεν υπάρχει τρόπος να καταργήσετε αυτές τις παρουσίες μέσω προγραμματισμού, αλλά θα καταργηθούν κατά τη λήξη της περιόδου λειτουργίας.

Ανατρέξτε στον πηγαίο κώδικα για ένα παράδειγμα SFSB.

Φασόλια που βασίζονται σε μηνύματα

Τα φασόλια που βασίζονται σε μηνύματα (MDBs) είναι το μόνο είδος φασολιών που πρέπει να εφαρμόσει μια επιχειρηματική διεπαφή. Αυτός ο τύπος διεπαφής δείχνει τον τύπο συστήματος ανταλλαγής μηνυμάτων που υποστηρίζει το φασόλι. Για MDB που βασίζονται σε JMS (Υπηρεσία μηνυμάτων Java), αυτή η διεπαφή είναι javax.jms.MessageListener. Σημειώστε ότι το επιχειρηματικό περιβάλλον MDB δεν είναι πραγματικά α επιχείρηση διεπαφή, είναι απλώς μια διεπαφή μηνυμάτων.

Φασόλια οντότητας

Τα φασόλια οντοτήτων επισημαίνονται με το @Οντότητα σχολιασμός και όλες οι ιδιότητες / πεδία στην κατηγορία φασολιών οντοτήτων δεν επισημαίνονται με το @Παροδικός ο σχολιασμός θεωρείται επίμονος. Τα επίμονα πεδία φασολιών οντότητας εκτίθενται μέσω ιδιοτήτων τύπου JavaBean ή ακριβώς όπως τα δημόσια / προστατευόμενα πεδία κλάσης Java.

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

Ανατρέξτε στον πηγαίο κώδικα για ορισμένα παραδείγματα κόκκων οντοτήτων.

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

Το EJB 3.0 υποστηρίζει αμφίδρομες και αμφίδρομες σχέσεις μεταξύ κόκκων οντοτήτων, οι οποίες μπορεί να είναι σχέσεις one-to-one, one-to-many, many-to-one ή many-to-many. Ωστόσο, οι δύο πλευρές μιας αμφίδρομης σχέσης διακρίνονται ως η ιδιοκτήτρια πλευρά και η αντίστροφη πλευρά. Η ιδιοκτήτρια πλευρά είναι υπεύθυνη για τη διάδοση αλλαγών σχέσεων στη βάση δεδομένων. Για πολλές-προς-πολλές ενώσεις, η ιδιοκτησία πλευρά πρέπει να προσδιορίζεται ρητά. Στην πραγματικότητα είναι η αντίστροφη πλευρά που καθορίζεται από το isInverse = αλήθεια μέλος σχολιασμού στην πίσω πλευρά Πολλοί σχόλιο; από αυτό, συνάγεται η ιδιοκτησία πλευρά. Τώρα, δεν είπε η ομάδα εμπειρογνωμόνων ότι έκανε το EJB πιο εύκολο;

Χαρτογράφηση O / R

Το μοντέλο χαρτογράφησης O / R έχει επίσης αλλάξει σημαντικά από την προσέγγιση που βασίζεται στο αφηρημένο-επιμονή-σχήμα σε ένα μοντέλο εμπνευσμένο από το Hibernate. Αν και η ομάδα εμπειρογνωμόνων συνεχίζει να συζητά το μοντέλο και μια σαφής εικόνα θα εμφανιστεί μόνο με το επόμενο σχέδιο, αυτό το σχέδιο παρουσιάζει σαφείς ενδείξεις της συνολικής προσέγγισης.

Για ένα, η αντιστοίχιση O / R θα καθοριστεί στην ίδια κατηγορία φασολιών οντοτήτων με σχολιασμούς. Επίσης, η προσέγγιση είναι να αναφέρεται σε συγκεκριμένους πίνακες και στήλες αντί για το σχήμα αφηρημένης επιμονής. Το μοντέλο χαρτογράφησης O / R έχει εγγενή υποστήριξη για εγγενή SQL. δηλαδή, υποστήριξη σε βαθύτερο επίπεδο, όχι μόνο η δυνατότητα εκτέλεσης εγγενών ερωτημάτων SQL. Για παράδειγμα, ο σχολιασμός ορισμών στηλών (@Στήλη) έχει μέλος στήλη Ορισμός που μπορεί να είναι κάτι σαν στήληDefinition = "BLOB NOT NULL".

Μοντέλο προγραμματισμού πελατών

Ένας πελάτης EJB μπορεί να αποκτήσει αναφορά στην επιχειρηματική διεπαφή του φασολιού χρησιμοποιώντας τον μηχανισμό έγχυσης (@Κάνω ένεση σχόλιο). Χρησιμοποιώντας το πρόσφατα εισαγόμενο @ javax.ejb.EJBContext.lookup () μέθοδος είναι μια άλλη προσέγγιση. Αλλά η προδιαγραφή δεν είναι ξεκάθαρη για το πώς ένας αυτόνομος πελάτης Java αποκτά αναφορά σε μια παρουσία bean, καθώς οι αυτόνομοι πελάτες Java εκτελούνται σε ένα κοντέινερ πελάτη J2EE και δεν έχουν πρόσβαση στο @ javax.ejb.EJBContext αντικείμενο. Υπάρχει ένας ακόμη μηχανισμός - ένα νέο καθολικό αντικείμενο περιβάλλοντος: @ javax.ejb.Context (). Αλλά, πάλι, η προδιαγραφή δεν λέει πώς μπορεί να χρησιμοποιηθεί αυτό το αντικείμενο σε ένα κοντέινερ πελάτη.

EJB QL

Τα ερωτήματα μπορούν να καθοριστούν μέσω του @NamedQuery σχόλιο. Δύο μέλη αυτού του σχολιασμού είναι όνομα και queryString. Μόλις καθοριστεί, μπορείτε να αποκτήσετε πρόσβαση σε αυτό το ερώτημα χρησιμοποιώντας το EntityManager.createNamedQuery (όνομα) μέθοδος. Μπορείτε επίσης να δημιουργήσετε ένα κανονικό ερώτημα τύπου JDBC (Java Database Connectivity) καλώντας EntityManager.createQuery (ejbqlString) ή ένα εγγενές ερώτημα χρησιμοποιώντας EntityManager.createNativeQuery (nativeSqlString).

Τα ερωτήματα EJB QL μπορούν να έχουν παραμέτρους θέσης και ονομασίας. ο javax.ejb.Ερώτημα Η διεπαφή παρέχει μεθόδους για τον καθορισμό αυτών των παραμέτρων, την εκτέλεση ενημερώσεων, την καταχώριση αποτελεσμάτων κ.λπ.

Ακολουθεί ένα παράδειγμα για το πώς μπορεί να δημιουργηθεί και να εκτελεστεί ένα ερώτημα EJB QL:

.. .. @NamedQuery (name = "findAllCustomersWithName", queryString = "SELECT c FROM Customer c WHERE c.name LIKE: custName") .. .. @ Ένεση δημόσιου EntityManager em; πελάτες = em.createNamedQuery ("findAllCustomersWithName") .setParameter ("custName", "Smith") .listResults (); 

Τα ακόλουθα παραθέτουν μερικές από τις διάφορες βελτιώσεις που έγιναν στο ίδιο το QL: