Ejemplo de Enterprise JavaBeans (EJB)

(Enero de 2005)

El diagrama del ejemplo

Vamos a ver un diagrama para no perder la visión de conjunto. Lo haremos ayudándonos de un ejemplo en el que la clase AccountEJB representa al Bean de una cuenta.

En el código fuente del cliente se refleja estas relaciones con los elementos del EJB. Para simplificar el cliente es una sencilla aplicación Java en modo texto. Importa recalcar que el cliente accede al Bean por medio de referencias del interfaz remoto (Account).


import java.util.*;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.rmi.PortableRemoteObject;

public class AccountClient {

   public static void main(String[] args) {

       try {
	   ////// Creo un contexto
           Context initial = new InitialContext();
           Object objref = initial.lookup("MyAccount");

	   ////// Para obtener un interfaz Home
           AccountHome home = 
               (AccountHome)PortableRemoteObject.narrow(objref, 
                                            AccountHome.class);

	   ////// Crea los Beans, referenciados por su interfaz remoto o "vista del bean" (Account)
           Account duke = home.create("123", "Duke", "Earl", 0.00);

	   ////// Accedo al Bean por medio del interfaz remoto
           duke.credit(88.50);
           duke.debit(20.25);
           double balance = duke.getBalance();
           System.out.println("balance = " + String.valueOf(balance));
           duke.remove();
           ....

La vista del Bean (EJBObject)

Es un interfaz que declara los métodos de lógica de negocio implementados en el EntityBean. Es el intermediario con el Bean:


import javax.ejb.EJBObject;
import java.rmi.RemoteException;

public interface Account extends EJBObject {
    
    public void debit(double amount)
        throws InsufficientBalanceException, RemoteException;

    public void credit(double amount)
        throws RemoteException;
    
    public double getBalance()
        throws RemoteException;
}

Interfaz local (EJBHome)

Es un interfaz responsable de la creación y localización de los objetos Bean:


import java.util.Collection;
import java.rmi.RemoteException;
import javax.ejb.*;

public interface AccountHome extends EJBHome {

    public Account create(String id, String firstName,
                          String lastName)
        throws RemoteException, CreateException;
    
    public Account findByPrimaryKey(String id) 
        throws FinderException, RemoteException;
    
    public Collection findByLastName(String lastName)
        throws FinderException, RemoteException;

    public Collection findInRange(double low, double high)
        throws FinderException, RemoteException;
}

El Bean (implementa EntityBean)


import java.sql.*;
import javax.sql.*;
import java.util.*;
import javax.ejb.*;
import javax.naming.*;

public class AccountEJB implements EntityBean {

    private String id;
    private String firstName;
    private String lastName;
    private double balance;
    private Connection con;
    private String dbName = "java:comp/env/jdbc/AccountDB";

    public void debit(double amount) 
       throws InsufficientBalanceException {

       if (balance - amount < 0) {
           throw new InsufficientBalanceException();
       }
       balance -= amount;
    }

    public void credit(double amount) {

       balance += amount;
    }
    
    public double getBalance() {

       return balance;
    }

    public String ejbCreate(String id, String firstName, 
       String lastName, double balance)
       throws CreateException {

       if (balance < 0.00) {
          throw new CreateException
             ("A negative initial balance is not allowed.");
       }

       try {
          insertRow(id, firstName, lastName, balance);
       } catch (Exception ex) {
           throw new EJBException("ejbCreate: " + 
              ex.getMessage());
       }

       this.id = id;
       this.firstName = firstName;
       this.lastName = lastName;
       this.balance = balance;

       return id;
    }
	....

Volver al índice