Rozdíly mezi EJB 3.0 a EJB 2.1

EJB 3.0 oproti EJB 2.1 zjednodušuje proces vytváření aplikací Enterprise JavaBean.

Základní koncepce použitá ke specifikaci EJB 3.0 staví na programovacím modelu POJO (Plain Old Java™ Object), jenž využívá anotace Java k zachycování informací dříve obsažených v deskriptorech implementace. Deskriptory implementace jsou nyní většinou nepovinné. Volné použití výchozích hodnot také znamená, že nemusíte psát a udržovat tolik podpůrného kódu. Značně se zjednodušují programátorské práce při vytváření a používání komponent EJB 3.0.

S verzí EJB 2.1 byla doplněna podpora webových služeb, změny v implementaci objektů session bean, změny ve způsobu volání objektů enterprise bean a nové schéma XML nahrazující DTD s definicí deskriptoru implementace ejb-jar.xml. EJB 3.0 jde však ještě o krok dále. EJB 3.0 zavádí lehký mechanizmus perzistence objektů entity bean na základě rozhraní API perzistence Java. Tyto entity jsou založeny na objektech POJO a lze je spouštět mimo kontejner EJB, přičemž nemusí obsahovat žádná rozhraní ani kód EJB. Podobně ani objekty typu session bean nevyžadují žádná rozhraní komponent specifických EJB.

Porovnání třídy EJB 2.1 se souborem deskriptoru implementace a odpovídající třídy EJB 3.0

Příklady uvedené v Tabulce 1 jsou z pohledu funkce ekvivalentní:

Tabulka 1. Porovnání EJB 2.1 a EJB 3.0
EJB 2.1 EJB 3.0

Třída 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();
       ...
     }
  ...
}

Třída Java

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

Deskriptor implementace

<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>
 
Ke změnám v EJB 3.0 oproti EJB 2.1 nejvíce přispěly čtyři následující fazety Java EE 5: