¿Cómo saber si una entidad JPA separada ya ha sido persistida o no?


Tengo una instancia de entidad JPA en la capa web UI de mi aplicación. Me gustaría saber en cualquier momento si esta entidad ya se ha mantenido en la base de datos o si solo está presente en la sesión del usuario.

Estaría en la capa de negocio, usaría entitymanager.contiene el método (Entity), pero en mi capa de interfaz de usuario creo que necesito un atributo adicional que indique si la entidad se ha guardado o no. Cómo implementar eso ? Estoy considerando la siguiente opción por el momento:

  • a Atributo JPA con un valor predeterminado establecido por la base de datos, pero forzaría una nueva lectura después de cada actualización ?
  • ¿un atributo no JPA establecido manualmente en mi código o establecido automáticamente por JPA?

¿Algún consejo / otras sugerencias ?

Estoy usando JPA 1 con implementación de Hibernate 3.2 y preferiría seguir el estándar.

Author: snowflake, 2010-05-06

1 answers

En primer lugar, recordemos los diversos estados de una entidad. De la especificación JPA 1.0 (en la sección 3.2 Ciclo de Vida de la Instancia de Entidad):

Esta sección describe la Operaciones de EntityManager para administrar ciclo de vida de una instancia de entidad. Un la instancia de entidad puede caracterizarse como nuevo, administrado, separado, o quitar.

  • A new entity instance has no persistent identity , and is not yet asociado con una persistencia contexto.
  • Una instancia de entidad administrada es una instancia con una identidad persistente eso está actualmente asociado con un contexto de persistencia.
  • A detached entity instance is an instance with a persistent identity eso no está (o ya no está) asociado con un contexto de persistencia.
  • A removed entity instance es una instancia con una identidad persistente, asociada con un contexto de persistencia, que está programada para eliminación de la base de datos.

Y una ilustración gráfica:

texto alt

Así que, por definición, una entidad separada ya ha sido persistida, y en realidad no creo que esta sea su verdadera pregunta. Ahora, si quieres saber si una entidad es nueva (es decir, no tiene ninguna identidad persistente), qué pasa con esto:

@Transient
public boolean isNew() {
    return (this.id == null);
}
 46
Author: Pascal Thivent,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-02-08 14:25:17