En este artículo se describe el modo más eficaz de
eliminar una instancia de persistencia gestionada por contenedor (CMP) de la agrupación de opción A. Primero,
añada un método al bean de persistencia gestionada por contenedor (CMP).
public void invalidateFromCache()
{
}
Añada este método a la interfaz local CMP. Modifique el
descriptor para el método de modo que utilice TX_REQUIRED.
Para
realizar esta acción mediante el editor del descriptor de EJB, pulse la
pestaña de ensamblaje y, a continuación, el botón
Añadir del panel de
transacciones del contenedor. Seleccione el CMP y, a continuación, pulse
el método invalidateFromCache. Seleccione Necesario en el recuadro
combinado y, a continuación, pulse
Aceptar. Seguidamente aparecerá un
mensaje parecido a: error. No se encuentra la referencia de recurso. Después, añada un método inicial como el que aparece a
continuación:
public void
ejbHomeInvalidateCompleteOrders(Collection/*<orderlocal>*/ orders)
{
Iterator iter = orders.iterator();
while(iter.hasNext())
{
OrderLocal order = (OrderLocal)iter.next();
// con esto se añada el bean de opción A a esta transacción de modo
// que cuando retrotraemos posteriormente
// se descarta, es decir, se elimina de la antememoria.
order.invalidateFromCache();
}
myEntityCtx.setRollbackOnly();
}
Para añadir este método a la factoría local del bean,
pulse este método, seleccione los Enterprise Beans y vuelva a la factoría
local. Establezca este atributo de transacción de método en RequiresNew,
utilizando también el mismo enfoque que antes. Este método toma una lista
de OrderLocal (nuestro CMP se llama Order) y los elimina de la
antememoria de opción A. Tenga en cuenta que podría haber tomado una
lista de claves, pero entonces hubiera sido necesario ejecutar una
findByPrimaryKey y, a continuación, llamar al método. Esto resulta más
costoso que el enfoque que se utiliza aquí. El método básicamente itera en
la lista y llama al método de invalidación en cada pedido de la lista. El método de invalidación asocia el bean de opción A con una
transacción actual. Después de asociar todos los beans con la
transacción, la marcamos sólo como de retrotracción. Cuando se devuelve
el método, la transacción se retrotrae y todos los beans de opción A se
descartan de la antememoria. La lógica empresarial acepta un nuevo pedido. Como parte de la
aceptación de un nuevo pedido, es posible que otros pedidos se completen.
El método acceptOrder devuelve List<
OrderLocal> al emisor. El
emisor debe pasar a continuación esta lista al método inicial que aparece
anteriormente para eliminarlos de la antememoria. No se
eliminan de la base de datos, sólo de la antememoria. A continuación
aparece un ejemplo:
BookLocal book = ivBookHome.findByPrimaryKey(ivOrder.getSymbol());
Collection/*<OrderKey>*/ completedOrders =
book.acceptOrder(session, pub, ivOrder, cache);
// invalidar todos los pedidos completados de la antememoria de
// opción A del CMP.
try
{
if(!completedOrders.isEmpty())
ivOrderHome.invalidateCompleteOrders(completedOrders);
}
catch(Exception e)
{
// ignorar excepciones esperadas
}
Este ejemplo muestra la búsqueda de un CMP Book mediante
la llamada del método de aceptación de pedido. Este método devuelve los
pedidos que deben eliminarse de la antememoria como resultado de la
llamada. El método acceptOrder utiliza una transacción RequiresNew
de modo que ésta se compromete automáticamente cuando se
devuelve el método. Es entonces cuando se utiliza el método inicial en
Order para eliminar los CMP devueltos de la antememoria. El método
acceptOrder recopila las instancias de Order que deben eliminarse:
public Collection/*<OrderLocal>*/ acceptOrder(…)
Collection completeOrders = new LinkedList();
OrderLocal buyer = ...;
OrderLocal seller = ...;
... some business logic....
if(buyer.getIsComplete())
completeOrders.add(buyer);
if(seller.getIsComplete())
completeOrders.add(seller);
…
return completedOrders;
}
Este código muestra cómo la aplicación elimina un objeto
en antememoria que acaba de procesar. Si la aplicación no hiciese esto, la
antememoria contendría instancias útiles e instancias inservibles. Las
instancias útiles son registros que todavía son necesarios, están
pendientes o no se han completado. No tiene sentido colocar en antememoria
los registros completados. Una aplicación puede utilizar este
enfoque para eliminar objetos completados.