Cómo conocer si el método persist ha guardado la entidad correctamente

Si nuestra aplicación usa JPA, tendremos muy presente el funcionamiento del método persist para guardar entidades en la base de datos. la firma del método persist, según la especificación de JPA 2.1 (la última hasta la fecha) el método persist consta de lo siguiente:

Supongamos que tenemos la siguiente situación:

  • Queremos insertar un usuario en base de datos
  • Queremos conocer si realmente se ha insertado el usuario en base de datos

Con esto persistimos nuestro usuario, pero dado a que el método persist no nos devuelve ningún feedback (sea un boolean o la misma entidad), ¿Qué podemos hacer nosotros para saber si el método persist ha ido bien? Pues tenemos varias opciones:

#Opción 1. Método contains del EntityManager. Documentación

Podríamos tener un método propio que sobreescriba el método persist de nuestro entityManager, de manera que nos devuelva un boolean, e implementarlo de la siguiente manera.

De cualquier manera, esto nos devolvería true, siempre y cuando se compruebe que la entidad esté disponible en la gestión de persistencia del entityManager, no realmente cuando hayamos añadido la misma, aunque por lo general se de en el mismo caso.

#Opción 2. Devolver la id de la entidad  (o la entidad completa)

Si todas las id de nuestras entidades son del mismo tipo, podríamos sobrescribir el método persist de manera que tras persistir nuestra entidad (y forzar la sincronización con la base de datos usando el método flush) devolvieramos la id de nuestra entidad (o como alternativa, nuestra propia entidad completa, aunque esta solución me gusta menos ya que tendríamos que devolver un objeto entity y luego castear en el destino a la entidad concreta).

#Opción 3. Añadir una propiedad a las entidades con una marca

Una última alternativa, podríamos añadir a la clase de la entidad una propiedad nueva (marcada con la anotación transient ya que no vamos a guardarla en base de datos, y si nuestra clase es serializable, le añadiremos la keyword transient también)

Con esto, nuestras entidades tendrán una propiedad (de uso auxiliar) que nos indicaran si si está persistida o no, con @PostLoad haremos que cualquier entidad al ser recuperada setee el campo persist a true, y con @Postpersist que cualquier entidad persistida.

Author: juanla

Share This Post On

Submit a Comment

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *