Différences entre EJB 3.0 et EJB 2.1

EJB 3.0 simplifie le processus de création des applications Enterprise JavaBean d'EJB 2.1.

Le concept sous-jacent à la spécification EJB 3.0 est centré sur un modèle de programmation des objets Java POJO qui utilise les annotations Java pour capturer les informations auparavant contenues dans les descripteurs de déploiement. Ces derniers sont à présent facultatifs dans la plupart des cas. En utilisant les valeurs par défaut, vous aurez moins de code à écrire et à maintenir. Cela simplifiera beaucoup la tâche de programmation liée à la création et à l'utilisation des composants EJB 3.0.

EJB 2.1 avait déjà amélioré la prise en charge des services Web, changé l'implémentation des beans session et la façon dont les beans enterprise sont appelés et proposé un nouveau schéma XML pour remplacer la DTD qui définissait le descripteur de déploiement ejb-jar.xml. Mais EJB 3.0 va plus loin : il propose un mécanisme léger de persistance des beans entity par l'API de persistance Java. Ces entités sont basées sur des objets POJO et peuvent être exécutées en dehors d'un conteneur d'EJB. Elles n'ont pas besoin de contenir d'interface ni de code EJB. De même, les beans session n'ont plus besoin non plus d'interfaces composant spécifiques à EJB.

Comparaison entre la classe EJB 2.1 avec descripteur de déploiement et la classe EJB 3.0 équivalente

Les exemples du tableau 1 sont fonctionnellement équivalents :

Table 1. Comparaison entre EJB 2.1 et EJB 3.0
EJB 2.1 EJB 3.0

Classe 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();
       ...
     }
  ...
}

Classe Java

@Stateless
public class AccountBean implements Account
{
     @Resource private DataSource accountDB;

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

Descripteur de déploiement

<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>
 
Les quatre facettes de Java EE 5 qui suivent ont apporté les changements majeurs désormais inclus dans EJB 3.0 :