Διαφορές μεταξύ του EJB 3.0 και του EJB 2.1

Σε σύγκριση με το EJB 2.1, το EJB 3.0 απλοποιεί τη διαδικασία δημιουργίας εφαρμογών Enterprise JavaBean.

Η προδιαγραφή EJB 3.0 εστιάζει σε ένα μοντέλο προγραμματισμού σαφών παλαιών αντικειμένων Java™ (POJO) που χρησιμοποιεί σημειώσεις Java για την αποτύπωση πληροφοριών που συνήθως περιέχονται σε αρχεία περιγραφής διανομής. Τα αρχεία περιγραφής διανομής είναι πλέον προαιρετικά στις περισσότερες περιπτώσεις. Η απεριόριστη χρήση προεπιλεγμένων τιμών σημαίνει ότι πρέπει να δημιουργήσετε και να διατηρήσετε λιγότερο υποστηρικτικό κώδικα. Με αυτόν τον τρόπο απλοποιείται σε μεγάλο βαθμό η εμπειρία προγραμματισμού για τη δημιουργία και χρήση των συστατικών στοιχείων του EJB 3.0.

Παρόλο που στο EJB 2.1 προστέθηκε υποστήριξη για διαδικτυακές υπηρεσίες, ένα νέο σχήμα XML για αντικατάσταση του DTD που όριζε το αρχείο περιγραφής διανομής ejb-jar.xml, πραγματοποιήθηκαν αλλαγές στην υλοποίηση των bean συνεδρίας και στον τρόπο κλήσης των enterprise bean, το EJB 3.0 αναπτύχθηκε ακόμα περισσότερο. Το EJB 3.0 εισήγαγε ένα μηχανισμό μονιμοποίησης entity bean μέσω του Java Persistence API. Αυτές οι οντότητες βασίζονται σε POJO, μπορούν να εκτελεστούν εκτός μιας θέσης υποδοχής EJB και δεν απαιτούν διεπαφές ή κώδικα EJB. Παρόμοια, τα bean συνεδρίας δεν απαιτούν πλέον ούτε διεπαφές συστατικών στοιχείων ειδικά για το EJB.

Σύγκριση κλάσης EJB 2.1 και αρχείου περιγραφής διανομής με ισοδύναμη κλάση EJB 3.0

Τα παραδείγματα στον Πίνακα 1 είναι λειτουργικά ισοδύναμα:

Πίνακας 1. Σύγκριση EJB 2.1 και EJB 3.0
EJB 2.1 EJB 3.0

Κλάση Java

public class AccountBean
implements javax.ejb.SessionBean {
 
     SessionContext ctx;
     DataSource accountDB;
 
     public void setSessionContext(SessionContext ctx) {
        this.ctx = ctx;
     }
 
     public void ejbCreate() {
          accountDB = (DataSource)ctx.lookup(
                          "jdbc/accountDB");
 
     }
     public void ejbActivate() { }
     public void ejbPassivate() { }
     public void ejbRemove() { }

     public void setAccountDeposit(int empId,
                                      double deposit) {
       ...
       Connection conn = accountDB.getConnection();
       ...
     }
  ...
}

Κλάση Java

@Stateless
public class AccountBean implements Account
{
     @Resource private DataSource accountDB;
 
     public void setAccountDeposit(int customerId,
                                      double deposit) {
       ...
       Connection conn = accountDB.getConnection();
       ...
     }
  ...
}

Αρχείο περιγραφής διανομής

<session>
  <ejb-name>AccountBean</ejb-name>
  <local-home>AccountHome</local-home>
  <local>Account</local>
  <ejb-class>com.example.AccountBean</ejb-class>
  <session-type>Stateless</session-type>
  <transaction-type>Container</transaction-type>
  <resource-ref>
    <res-ref-name>jdbc/accountDB</res-ref-name>
    <res-ref-type>javax.sql.DataSource</res-ref-type>
    <res-auth>Container</res-auth>
  </resource-ref>
</session>
...
<assembly-descriptor>...</assembly-descriptor>
 
Οι ακόλουθες τέσσερις όψεις του Java EE 5 συνεισφέραν περισσότερο στις αλλαγές που πραγματοποιήθηκαν στο EJB 3.0 από το EJB 2.1: