Diferencias entre EJB 3.0 y EJB 2.1

Comparado con EJB 2.1, EJB 3.0 simplifica el proceso de crear aplicaciones Enterprise JavaBean.

El concepto subyacente de la especificación EJB 3.0 se centra en un modelo de programación de objeto Java™ antiguo simple (POJO) que utiliza anotaciones Java para capturar información que los descriptores de despliegue solían contener. Ahora, los descriptores de despliegue son opcionales en la mayoría de los casos. La utilización generosa de valores predeterminados también significa que necesita escribir y mantener menos código de soporte. Esto simplifica mucho la experiencia de programación al crear y utilizar componentes EJB 3.0.

Mientras que EJB 2.1 añadía soporte para servicios Web, cambios en la implementación de beans de sesión, cambios en la forma de invocar beans de empresa y un esquema XML nuevo para sustituir la DTD que definía el descriptor de despliegue ejb-jar.xml, EJB 3.0 ha llevado esto un paso más allá. EJB 3.0 ha introducido un mecanismo de persistencia de bean de entidad ligero a través de la API de persistencia de Java. Estas entidades están basadas en POJO y por tanto pueden ejecutarse fuera de un contenedor EJB y no necesitan ninguna interfaz ni incluir código EJB. De forma parecida, los beans de sesión tampoco necesitan interfaces de componente específicos de EJB.

Comparación de clases EJB 2.1 más archivo de descriptor de despliegue con la clase EJB 3.0 equivalente

Los ejemplos de la Tabla 1 son funcionalmente equivalentes:

Tabla 1. Comparación de EJB 2.1 y EJB 3.0
EJB 2.1 EJB 3.0

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

Clase Java

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

Descriptor de despliegue

<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>
 
Las cuatro facetas siguientes de Java EE 5 son las que más han contribuido a los cambios en EJB 3.0 desde EJB 2.1: