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:
/** * Make an instance managed and persistent. * @param entity * @throws EntityExistsException if the entity already exists. * (If the entity already exists, the EntityExistsException may * be thrown when the persist operation is invoked, or the * EntityExistsException or another PersistenceException may be * thrown at flush or commit time.) * @throws IllegalArgumentException if the instance is not an * entity * @throws TransactionRequiredException if there is no * transaction when invoked on a container-managed * entity manager that is of type * PersistenceContextType.TRANSACTION. */ public void persist(Object entity);
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
UserEntity e = new UserEntity(); e.setName("Name"); e.setAge(30); em.persist(e);
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.
UserEntity e = new UserEntity(); e.setName("Name"); e.setAge(30); em.persist(e); ---- return em.contains(e);
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).
UserEntity e = new UserEntity(); e.setName("Name"); e.setAge(30); em.persist(e); em.flush(); ---- return e.getId();//or return e;
#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)
@Transient private boolean persisted; @PostLoad @PostPersist public void setPersisted() { persisted=true; } public boolean getPersisted() { return persisted; }
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.