Histórico de datos, auditoría y diferencias entre objetos con Javers en Java

Publicado por pico.dev el .
blog-stack java planeta-codigo programacion
Comentarios

Por seguridad, por auditoría o histórico de datos una aplicación puede requerir no solo guardar los valores actuales de los datos que maneja sino también las versiones anteriores y los cambios en cada valor de los mismos. En Java hay una librería llamada Javers que nos proporciona funcionalidades como comparación, snapshots, persistencia y un lenguaje de consulta para hacer búsquedas.

Java

Por necesidades de negocio y requerimientos funcionales puede ser necesario guardar un histórico de ciertos datos de una aplicación en vez de solo la última versión de los datos. Tener solo la última versión de algunos datos puede no ser lo que se necesita. Por ejemplo, supongamos que una aplicación maneja una entidad de dominio producto y esta tiene un campo que es el precio y queremos guardar los cambios que se hacen a esta entidad para conocer el cambio de precio que han sufrido los productos. Otras necesidades pueden ser por auditoría o seguridad para saber que usuario ha hecho que cambios en los datos, para disponer de versiones anteriores de una entidad, comparar dos versiones de la misma entidad o lanzar consultas para obtener información de los cambios que se han producido.

Una librería que en Java nos ofrece toda esta información de auditoría es Javers con la posibilidad de persistirla en diferentes sistemas, en las tradicionales base de datos relacionales o en una base de datos no SQL como MongoDB. En la documentación encontramos como podemos comparar dos objetos, persistir cambios o lanzar consultas.

Javers diferencia dos tipos de objetos Entities o ValueObjects. Los ValueObjects son objetos java bean tradicionales de Java que no tenen identificador asignado y no son persistibles pero se pueden usar para hacer comparaciones entre dos objetos según las propiedades de los java beans. Los objetos java bean Entities tienen una propiedad que representa el identificativo de la entidad y las comparaciones se pueden hacer entre diferentes versiones del mismo.

En el siguiente ejemplo muestro como hacer comparaciones, como hacer cambios y persistirlos, como lanzar una consulta para obtener los cambios que se han producido u obtener snapshots de versiones anteriores y como persistir estos cambios en una base de datos PostgreSQL en la que utilizaré Docker. En la primera sección del ejemplo se comparan dos objetos y obtienen sus diferencias, posteriormente se persisten varios cambios y finalmente se realiza una consulta para obtener los cambios que haya habido en la propiedad price.

La información se persistirán en varias tablas en este caso en un base de datos relacional PostgreSQL que Javers creará al iniciarse la aplicación, ejecutada la aplicación encontraremos datos.

El código fuente completo del ejemplo puedes descargarlo del repositorio de ejemplos de Blog Bitix alojado en GitHub y probarlo en tu equipo ejecutando el comando ./gradlew run.

Yo apoyo al software libre