|
Buscador
Secciones
Otras zonas
Registro
Foros
Recomendamos
|
Primero generamos las clases EJB y luego examinaremos esas etiquetas:
Ahora veamos qué ficheros ha generado Xdoclet. Como puedes ver abajo, los ficheros son casi los mismos que para BMP, excepto que no hay clases de clave primaria o de DAO, y ahora hay un ItemCMP que extiende la clase ItemBean. El resto son los mismos que para los beans de entidad BMP: ![]() Examinemos esas nuevas etiquetas, algunas de las cuales hemos visto en páginas anteriores:
El siguiente fragmento de código muestra como se declaran los atributos persistentes en un bean de entidad CMP: ![]()
|
|
Nota de errata:
Hay un error en la siguiente figura. El atributo Integer llamado 'qunatity' debería ser 'quantity'. |

|
Nota:
El otro aspecto interesante de ejbCreate es su tipo de retorno, ya que debe ser el mismo que el tipo de la clave primaria (es decir, tiene que ser String, Integer, Float, o cualquier otro). En este caso es String -- el tipo de itemID, y cuando lo implementemos debería devolver null (puedes ver la especificación 10.5.1 de EJB). |
Añadir un Método Finder:|
Nota:
Un interface home de un bean de entidad define uno o más métodos finder, para encontrar un objeto entidad o una colección de ellos. El nombre de cada método finder empieza con el prefijo find, como en findPrice o findQuantity en nuestro caso. Todo método finder, excepto findByPrimaryKey(key) debe estar asociados con un elemento query en el descriptor de despliegue. El preveedor del bean de entidad declara la consulta EJB QL y la asocia con el método finder en el descriptor de despliegue. Un método find normalmente se caracteriza por un string de consulta EJB QL especificado mediante el elemento query. |
Ahora añadamos un método finder a nuestra clase bean para buscar ítems suministrados por un proveedor particular. Para poder hacer esto tenemos que declarar la etiqueta a nivel de clase que hemos descrito arriba: @ejb.finder.
@ejb.finder query="SELECT OBJECT(a) FROM MyStoreItem a where a.supplierID = ?1" signature="java.util.Collection findBySupplierID(java.lang.String supplierID)"
|
Nota:
En EJB QL, en lugar del nombre de la tabla, se utiliza el nombre del esquema (en este caso MyStoreItem, en vez de especificar Item para una consulta SQL). Lo mismo ocurre con los nombres de columnas que se utilizarían en SQL, en EJB QL son reemplazados por los correspondientes atributos declarados en el bean. |

Tiene cuatro métodos, incluyendo los dos métodos finder generados por las etiquetas declaradas a nivel de clase. Los otros dos, create y findByPrimaryKey los crea Xdoclet (mediante la etiqueta <entitycmp/> en ejbGenerate.xml.
@ejb.finder query="SELECT OBJECT(c) FROM MyStoreItem c where c.quantity =0" signature="java.util.Collection findByOutOfStock()"
Abajo puedes ver un fragmento de código de estos métodos finder en la clase ItemLocalHome después de regenerar las clases EJB:

Ahora, regenera tus clases EJB y analiza las clases importantes. Todos los métodos finder están completos. Añadamos ahora algunos métodos de negocio.
Añadir Métodos de Negocio:|
Nota:
Ya hemos visto como añadir métodos de negocio en las páginas anteriores... |
Estos proporciona la descripción de los ítems individuales de MyStore.

Integer qty = new Integer((quantity.intValue() + getQuantity().intValue()) ); setQuantity (qty);
Abajo puedes ver un fragmento del método fillStock de la clase ItemBean:

Añadir un Método de Retrollamada:Al contrario que en BMP (donde se generarón automáticamente) tenemos que añadir los métodos de retrollamadas que se sobreescribirán en la clase ItemCMP.
javax.ejb.EntityContext
protected EntityContext eContext;

Ahora ya están completos todos los métodos, es hora de regenerar las clases EJB y examinar la clase ItemCMP generada, que es la más interesante.
Al contrario que en nuestro bean BMP todo el comportamiento de persistencia de atributos se ha sobreescrito por métodos abstractos. Esto es porque el contenedor EJB es el responsable de mantener su persistencia.

Todos los métodos de retrollamadas que hemos implementado se sobreescribirán así:

|
Nota:
No hay métodos ejbFinder en esta clase como en los beans BMP, ya que todo esto lo controla el contenedor. Al igual que ya apuntamos antes, tampoco se generan clases PrimaryKey ni se necesita una clase DAO, porque todo lo controla el contenedor. |
Ahora, antes de desplegar nuestro bean, echaremos un vistazo a ejb-jar.xml y jboss.xml para ver que descriptores se han generado.
|
Nota:
No tenemos que escribir ningún descriptor para la fuente de datos como hicimos en los beans de sesión y BMP, ya que el contenedor EJB es el responsable de esto. |

Como se ve el fragmento anterior, todos los métodos abstractos se han generado como campos persistentes dento de la etiqueta <cmp-field> debido a la etiqueta @persistence-field declarada en cada método accesor. También se han generado el descriptor de la clase primaria dentro de la etiqueta <primary-key-class> y el campo de la clave primaria en la etiqueta <primarykey-field> debido a la etiqueta @field-pk declarada para los atributo(s) importantes.
Los descritores de los métodos finder se han generado junto con la consulta definida para buscar los datos como se ve abajo. Estas etiquetas finder las ha generado la etiqueta @ejb.finder declaraa a nivel de clase.

Y en el fichero jboss.xml, se han generado los siguiente descritores mediante la etiqueta @ejb.bean declarada a nivel de clase:

Se ha completado la funcionalidad del bean Item y ya está listo para desplegarlo.
Desplegar el Bean Item:|
Nota:
Esto es para arrancar el servidor. Si ya está ejecutándose saltate estos pasos y ve al siguiente. |

Los mensajes de la consola indicarán si tu bean se ha desplegado con éxito o no.
Ahora modifiquemos StoreAccessBean para llamar a los métodos de ItemBean.
private ItemLocalHome itemLocalHome;

Añadir un Método de Negocio a StoreAccess:Ahora añadiremos otro método de negocio al bean StoreAccess para llamar a los métodos de negocio de nuestro bean Item.
ItemLocal item = itemLocalHome.findByPrimaryKey(itemID)
ItemData myItem = item.getItemData()

Collection items = null; ArrayListItemsOutOfStock = null;
items = itemLocalHome.findByOutOfStock()
ItemLocal myItemLocal = (ItemLocal) iterate.next(); itemsOutOfStock.add(myItemLocal.getItemData());

Collection suppliedItems = null; ArrayList itemsBySupplier = null;
suppliedItems = itemLocalHome.findBySupplierID(supplierID)
ItemLocal myItemsLocal = (ItemLocal) iterate.next(); itemsBySupplier.add(myItemsLocal.getItemData());

Ahora que hemos añadido a StoreAccess todos los métodos necesarios para acceder a los métodos de negocio de Item, lo único que nos queda son los descriptores de despliegue requeridos para enlazar/referenciar StoreAccess y Item. Por eso añadiremos estás dos etiquetas:

@ejb.ejb-ref ejb-name="Item" view-type="local" ref-name="ItemLocal"
Esta etiqueta generará los descriptores de despliegue en ejb-jar.xml, ya que StoreAccessBean tiene que saber a qué bean se está referenciando, cuál es su view-type y su ref-name. Esto generará los siguientes descriptores de despliegue:

@jboss.ejb-ref-jndi ref-name="ItemLocal" jndi-name="ItemLocal"
Esta etiqueta generará los descriptores de despliegue en jboss.xml, ya que el servidor de aplicaciones tiene que saber qué nombre JNDI tiene el bean que se ha registrado. Esto generará estos descriptores de despliegue:
|
Nota:
ref-name y jndi-name se utilizan para beans locales (en la misma JVM). |

|
Nota:
Podemos ver en los descriptores de despliegue generados por la etiqueta @jboss, que para los tipos de vista 'local' genera descriptores de despliegue incorrectos, como explicamos en páginas anteriores. Por eso, cada vez que utilices esta etiqueta tienes que cambiar el <ejb-ref> por <ejb-local-ref> antes del despliegue. Cuidado: tienes que hacer esto manualmente cada vez que regeneres tus clases EJB, ya que jboss.xml se sobreescribirá en cada regeneración. |
Tras estos cambios nuestro bean Item ya está completo, ya puedes desplegarlo de nuevo, desde Lomboz J2EE View. La consola te indicará el estado del despliegue.
Una vez que el bean se ha desplegado con éxito, crea un test de cliente que llame al método loginUser del bean StoreAccess, a getCustomerData del bean Customer, a getManagerData del bean Manager y a getOutOfStockItems del bean Item.
Crear tu Test de Cliente:Esto generará los métodos necesarios en tu clase SessionCMPClient y sólo tendrás que llamar a loginUser, getCustomerData, getManagerData (el bean Manager se desarrolló como parte del ejercicio de la página anterior) y a getOutOfStockItems.
Iterator itemsIterator = null; ArrayList items = null;
System.out.println("Request from client : ");
String userID = myBean.loginUser("ANDY","PASSWD");
System.out.println("Reply from Server: Your userid is " + userID );
CustomerData cd = myBean.getCustomerData(userID);
System.out.println ("Andy your details with MyStore are " + cd );
String mgrID = myBean.loginUser("RUSTY","PASSWD");
System.out.println("Reply from Server: Your mgrid is " + mgrID );
ManagerData md = myBean.getManagerData(mgrID);
System.out.println ("Rusty your details with MyStore are " + md );
System.out.println("Manager Request : List items out of stock ");
items = myBean.getOutOfStockItems();
itemsIterator = items.iterator();
System.out.println("List Of Out Of stock Items ");
while ( itemsIterator.hasNext() ) {
ItemData itemData= ( ItemData ) itemsIterator.next();
System.out.println ("Item Data " + itemData );
}
Probar tu Cliente:
Ahora en tu consola, deberías obtener como repuestas CALCULATOR y CLOCK, exactamente igual que en esta imagen:

Ejercicio:Aquí tienes un ejercicio para tí. Para seguir más allá, debes implementar Supplier como un bean de entidad CMP. Aquí tienes la lista de tareas:
query "SELECT OBJECT(b) FROM MyStoreSupplier as b where b.userID = ?1"
au.com.tusc.cmp.SupplierLocal findUserID(java.lang.String userID)
|
Nota:
La firma del método es find<cmp attribute> en lugar de findByPrimaryKey, porque los métodos finder de atributos que no son claves utilizan esta covención. De acuerdo al tipo de retorno para los métodos finder será Collection o <entity type>, según se especifica en la especificación EJB, secciones 10.5.6 y 10.5.2, respectivamente. |
public SupplierData getSupplierData()
public void requestItem(String itemID, Integer quantity)
public void setEntityContext(EntityContext ctx) public void unsetEntityContext()
private SupplierLocalHome supplierLocalHome
public ItemData getItemData(String itemID)
1. @ejb.ejb-ref ejb-name="Supplier"
view-type="local"
ref-name="SupplierLocal"
2. @jboss.ejb-ref-jndi ref-name="SupplierLocal"
jndi-name="SupplierLocal"
|
Nota:
Todos estos pasos ya los has realizado para implementar el bean Item. Es necesario que implementes este bean porque lo utilizaremos en las páginas siguientes: En el caso de que tengas dificultades, aquí te proporcionamos las clases para que las descargues: |
| Leer comentarios (70) | |
| Escribir comentario | |
| Puntuación: |
|
| Votar | |
| Recomendar este tutorial | |
| Estadísticas |
Copyright © 1999-2007
Programación en castellano.
Todos los derechos reservados.
Formulario de Contacto -
Datos legales -
Publicidad
Hospedaje web y servidores dedicados linux por Ferca Network
red internet: musica mp3 | logos y melodias | hospedaje web linux | registro de dominios | servidores dedicados
más internet: comprar | recursos gratis | posicionamiento en buscadores | tienda virtual | gifs animados