sábado, 30 de junio de 2012

Auditoría con JPA

Auditoría es uno de los pedidos que más suena cuando tenemos una base de datos.  Los requerimientos de auditoría pueden ser bien simples (como agregar cuatro columnas a todos los registros que indiquen usuario de creación, fecha de creación, usuario de modificación y fecha de modificación) o bien complejos (como clonar absolutamente todos los datos con cada modificación de un registro en tablas de historiales).

Para esto, la especificación de JPA provee anotaciones para marcar ciertos métodos que queremos que se invoquen dado determinado evento. Los eventos pueden ser:
  • @PostLoad
  • @PrePersist
  • @PostPersist
  • @PreUpdate
  • @PostUpdate
  • @PreRemove
  • @PostRemove
Podemos leer más sobre los eventos de JPA aquí.

Este link de la documentación de EclipseLink es también muy interesante. Explica distintas formas de auditar utilizando EclipseLink, la implementación de referencia de JPA 2. La que más me ha gustado a mí es la de la clase AuditedObject, que muestro a continuación:


La idea es bien simple. Todas las entidades que extiendan de AuditedObject van a heredar los atributos auditUser y auditTimestamp. Mediante el método updateAuditInfo que es disparado por los eventos @PrePersist y @PreUpdate, estos atributos se mantendrán actualizados de forma transparente. Lo único que tiene de malo es que hay que acordarse de setear el currentUser en la variable ThreadLocal. En una aplicación web esto tiene que hacerse en cada request. Yo, por ejemplo, resolví esto de forma sencilla usando un Filter de Servlets.

Cuando los requerimientos de auditoría son mucho más complejos, como en el caso de mantener tablas de historiales y repetir cada una de las columnas cada vez que hay un cambio sobre un registro, quizá necesitemos una solución más compleja como la que provee JBoss Envers para Hibernate.

sábado, 9 de junio de 2012

JBoss Developer Framework

Esta semana JBoss ha anunciado el proyecto JBoss Developer Framework (noticia aquí y aquí). Para los que venimos siguiendo a JBoss nos puede sorprender: ¿JBoss Developer Framework? ¿De qué hablan? ¿De Seam? ¿De las plataformas certificadas?

Más que un framework, JDF se trata de un portal cuyo propósito es proporcionar documentación y ejemplos para que la gente comience a trabajar con Java EE 6 usando a JBoss como servidor de aplicaciones y stack de implementaciones.

¿Qué ofrece JDF? Más de 50 Quickstarts, ejemplos (como el de TicketMonster, una aplicación completa subida a GitHub, que usa JPA2, Bean Validation, servicios REST expuestos con JAX-RS, HTML 5 en el cliente, Seam Forge, y GWT a través de Errai, tomá!!), tutoriales de migración (de Spring a Java EE 6, de Java EE 5 a Java EE 6, etc) , BOMs (una serie de archivos BOMs de Maven para facilitar el despliegue y test de aplicaciones Java EE 6) y Roadmap (en el que planean ir agregando nuevas tecnologías al stack como Detaspike, que ya mencioné en este post, y Aerogear).

En el mundo del conocimiento, JDF está enfocado a la educación y la difusión de Java EE 6, mostrando de una forma práctica y ágil cómo utilizar los productos y las implementaciones del universo JBoss. Todo un ejemplo del Open Source. Un proyecto ambicioso. Esperemos que con el tiempo no caiga en vía muerta como sucedió en el pasado con tantos otros proyectos educativos, incluso del mismo JBoss.