Anotaciones en EJB 3.0 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.
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.
@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.