19 abril 2009

Anotaciones EJB3

Anotaciones en EJB 3.0

http://www.adictosaltrabajo.com/tutoriales/tutoriales.php?pagina=AnotacionesEJB3


API de Persistencia: EntityManager

Primero veremos algunas partes importantes de la API, como la interfaz EntityManager. Esta interfaz es en la que se apoya la API de persistencia y la que se encarga del mapeo entre una tabla relacional y su objeto Java. Funcionalmente es similar a la clase Session de Hibernate o a PersistenceManager de JDO. Proporciona mé;todos para manejar la persistencia de un Bean de Entidad, permite añadir, eliminar, actualizar y consultar así como manejar su ciclo de vida. Sus métodos má;s importantes son:

  • persist(Object entity) - almacena el objeto entity en la base de datos.

  • merge(T entity) - actualiza las modificaciones en la entidad devolviendo la lista resultante.

  • remove(Object entity) - elima la entidad.

  • find(Class entity, Object primaryKey) - busca la entidad a través de su clave primaria.

  • flush() - sincroniza las entidades con el contenido de la base de datos.

  • refresh(Object entity) - refresca el estado de la entidad con su contenido en la base de datos.

  • createQuery(String query) - Crea una query utilizando el lenguaje JPQL.

  • createNativeQuery() - Crea una query utilizando el lenguaje SQL.

  • isOpen() - Comprueba si está; abierto el EntityManager.

  • close() - Cierra el EntityManager.

Podemos obtener una referencia al EntityManager a través de la anotación @PersistenceContext. El contenedor de EJB nos proporciona el contexto de persistencia mediante inyección por lo que no tendremos que preocuparnos de su creación y destrucción.

@PersistenceContext
EntityManager entityManager;

Otra forma de obtener un EntityManager es a través de la factoría EntityManagerFactory con el nombre del contexto de persistencia configurado en el persistence.xml .


EntityManagerFactory emf = Persistence.createEntityManagerFactory("TestPersistence");
EntityManager em = emf.createEntityManager();

En el método createEntityManagerFactory de la clase Persistence se debe pasar el nombre del contexto definido en el persistence.xml .



Ciclo de vida de una Entidad

Engloba dos aspectos: la relación entre el objeto Entidad y su contexto a persistir y por otro lado la sincronización de su estado con la base de datos. Para realizar estas operaciones la Entidad puede encontrarse en cualquiera de estos cuatro estados:

  • new - Nueva instancia de la Entidad en memoria sin que aún le sea asignado su contexto persistente almacenado en la tabla de la base de datos.

  • managed - La Entidad dispone de contenido asociado con el de la tabla de la base de datos debido a que se utilizó el método persist(). Los cambios que se produzcan en la Entidad se podrá;n sincronizar con los de la base de datos llamando al método flush().

  • detached - La Entidad se ha quedado sin su contenido persistente. Es necesario utilizar el método merge() para actualizarla.

  • removed - Estado después de llamarse al método remove() y el contenido de la Entidad será; eliminado de la base de datos.


Anotaciones de un Bean de Entidad

@Entity: Indica que es un Bean de Entidad.

  • name - por defecto el nombre de la clase pero se puede especificar otra diferente.

Métodos del ciclo de vida de una Entidad

@EntityListeners: Se pueden definir clases oyentes (listeners) con métodos de ciclo de vida de una entidad. Para hacer referencia a un listener se debe incluir esta anotación seguido entre paréntesis de la clase: @Entity Listeners(MyListener.class)

@ExcludeSuperclassListeners: Indica que ningún listener de la superclase será; invocado por la entidad ni por ninguna de sus subclases.

@ExcludeDefaultListeners: Indica que ningún listener por defecto será; invocado por esta clase ni por ninguna de sus subclases.

@PrePersist: El método se llamará; justo antes de la persistencia del objeto. Podría ser necesario para asignarle la clave primaria a la entidad a persistir en base de datos.

@PostPersist: El método se llamará; después de la persistencia del objeto.

@PreRemove: El método se llamará; antes de que la entidad sea eliminada.

@PostRemove: El método se llamará; después de eliminar la entidad de la base de datos.

@PreUpdate: El método se llamará; antes de que una entidad sea actualizada en base de datos.

@PostUpdate: El método se llamará; después de que la entidad sea actualizada.

@PostLoad: El método se llamará; después de que los campos de la entidad sean cargados con los valores de su entidad correspondiente de la base de datos. Se suele utilizar para inicializar valores no persistidos.

@FlushMode: Modo en que se ejecuta la transacción: FlushModeType.AUTO (por defecto) y FlushModeType.COMMIT.

@NamedQuery: Especifica el nombre del objeto query utilizado junto a EntityManager.

  • name - nombre del objeto query.

  • query - especifica la query a la base de datos mediante lenguaje Java Persistence Query Language (JPQL)

@NamedQueries: Especifica varias queries como la anterior.

@NamedNativeQuery: Especifica el nombre de una query SQL normal.

  • name - nombre del objeto query.

  • query - especifica la query a la base de datos.

  • resultClass - clase del objeto resultado de la ejecución de la query.

  • resultSetMapping - nombre del SQLResultSetMapping definido (se explica má;s abajo).

@NamedNaviteQueries: Especifica varias queries SQL.

@SQLResultSetMapping: Permite recoger el resultado de una query SQL.

  • name - nombre del objeto asignado al mapeo.

  • EntityResult[] entities() - entidades especificadas para el mapeo de los datos.

  • ColumnResult[] columns() - columnas de la tabla para el mapeo de los datos.

@NamedNativeQuery(name="nativeResult", query="SELECT NOMBRE,APELLIDOS FROM USUARIOS WHERE USUARIO_ID= 123", resultSetMapping = "usuarioNamedMapping")

@SqlResultSetMapping(name="usuarioNamedMapping",
entities = {

@EntityResult(entityClass = com.autentia.entidades.Usuario.class,
fields = {

@ColumnResult(name="usuarioId", column="USUARIO_ID"),

@ColumnResult(name="nombre", column="NOMBRE"),
@ColumnResult(name="apellidos", column="APELLIDOS")})})

@PersistenceContext: Objeto de la clase EntityManager que nos proporciona todo lo que necesitamos para manejar la persistencia.

  • name - nombre del objeto utilizado para la persistencia en caso de ser diferente al de la clase donde se incluye la anotación.

  • unitName - identifica la unidad de la persistencia usada en el bean en caso de que hubiera má;s de una.

  • type - tipo de persistencia, TRANSACTION (por defecto) | EXTENDED.

@PersistenceContexts: Define varios contextos de persistencia.

@PersistenceUnit: Indica la dependencia de una EntityManagerFactory definida en el archivo persistence.xml.

  • name - nombre del objeto utilizado para la persistencia en caso de ser diferente al de la clase donde se incluye la anotación.

  • unitName - identifica la unidad de la persistencia usada en el bean en caso de que hubiera má;s de una.


@Lob: Se utiliza junto con la anotación @Basic para indicar que un campo se debe persistir como un campo de texto largo si la base de datos soporta este tipo.



No hay comentarios: