miércoles, 30 de enero de 2008

Stateless Session Bean

Un bean de sesión sin estado es aquél que no dispone de variables de instancia en las cuales se guarden datos que puedan ser compartidos entre los distintos métodos del bean. Es decir, se trata de un bean que por lo general contará con una serie de métodos que realizarán un trabajo determinado e independiente y que el resultado de las operaciones realizadas dentro de cada uno de los métodos no dependerá de ningún ?estado? relativo a la conversación que mantiene el cliente con el bean. Como puede ser que a través de mis palabras no quede suficientemente claro a qué me refiero creo que va a ser mejor que veamos un ejemplo. Tomemos como ejemplo un bean que se encarga de gestionar las operaciones básicas que podemos realizar con un cliente, como son consultar un cliente, guardar un cliente y borrarlo. En primer lugar tendríamos que crear una interface :
public interface CustomerServiceLocal {

public void saveCustomer( Customer customer );
public Customer getCustomer( Long id );
public Collection getAllCustomers();
public void deleteCustomer( Long id );

}
Podemos ver que se trata de una simple interface que no tiene ninguna característica particular. Todo bean de sesión sin estado es necesario que disponga de una interface y la que hemos definido arriba es perfectamente válida para nuestro servicio de clientes. Si no la hubiéramos creado y hubiéramos definido directamente el bean sin la creación de la interface, hubiera sido el propio contenedor quién la hubiera creado por nosotros. La intefaz debiera de tener una anotación, que le indicara si se trata de una interface Local o Remote. Si el bean va a ser utilizado por una clase que se ejecute dentro de la misma JVM en la que se ejecuta el bean de sesión entonces la interface podría ser Local, y si el bean va a ser llamado por una clase que se ejecuta en una JVM distinta entonces la interface tendría que ser Remote. Por defecto, si no se indica nada, será tratada como una interface Local. Ejemplo de interface local :
@Local
public interface CustomerServiceLocal {

public void saveCustomer( Customer customer );
public Customer getCustomer( Long id );
public Collection getAllCustomers();
public void deleteCustomer( Customer customer );

}
Ejemplo de interface remota :
@Remote
public interface CustomerServiceRemote{

public void saveCustomer( Customer customer );
public Customer getCustomer( Long id );
public Collection getAllCustomers();
public void deleteCustomer( Customer customer );

}
Ahora nos faltaría crear el bean propiamente dicho :
@Stateless
public class CustomerService implements CustomerServiceLocal {

@PersistenceContext()
private EntityManager em;


public void saveCustomer( Customer customer ) {
em.persist( customer );
}

public Customer getCustomer( Long id ) {
Query q = em.createQuery( "SELECT c FROM Quiz c WHERE c.id = :id" ).
setParameter( "id", id );

return (Customer)q.getSingleResult();
}

public Collection getAllCustomers() {
return em.createQuery( "SELECT c from Customer c" ).getResultList();
}

public void deleteCustomer( Customer customer ) {
em.remove( customer );
}

}

1 comentario:

Unknown dijo...

Muchísimas gracias por el tiempo dedicado a esta explicación. Me resultó bastante difícil encontrar un lugar que explicara esto, ya que casi toda la documentación asume (en especial la de EclipseLink) asume que se conoce.

Una que consulta que probablemente con la que tal vez me puedas ayudar.

¿Donde puedo encontrar el detalle de todos los Annotations (@Stateless, por ejemplo)? Busqué en la especificación de JPA o en la doc de Eclipselink y objectDB pero nada. Al final, siento que obtengo la info de terceras partes.

Gracias de antemano.