2010-05-06 31 views
26

Tengo una instancia de entidad JPA en la capa de interfaz de usuario web de mi aplicación. Me gustaría saber en cualquier momento si esta entidad ya se ha conservado en la base de datos o si solo está presente en la sesión del usuario.¿Cómo saber si una entidad JPA separada ya ha sido persistente o no?

Sería en la capa de negocio, usaría el método entitymanager.contains (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 seguir la opción por el momento:

  • un 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 configurado manualmente en mi código o configurado automáticamente por JPA?

¿Algún consejo/otras sugerencias?

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

Respuesta

44

Primero, recordemos los diferentes estados de una entidad. A partir de la especificación JPA 1.0 (en la sección 3.2 del Ciclo de Vida de la Entidad Instancia):

Esta sección describe las operaciones EntityManager para la gestión del ciclo de vida de una instancia de entidad. Una instancia de entidad se puede caracterizar como como nueva, administrada, separada o eliminada.

  • Una nueva instancia entidad ha sin identidad persistente, y sin embargo no es asociado con un contexto de persistencia.
  • Un logró instancia de la entidad es una instancia con una identidad persistente que actualmente está asociada con un contexto de persistencia.
  • A individual instancia de la entidad es una instancia con una identidad persistente que no es (o ya no) asociado con un contexto de persistencia.
  • A eliminado entidad instancia es una instancia con una identidad persistente, asociada con un contexto de persistencia, que está programado para su eliminación de la base de datos.

Y una ilustración gráfica:

alt text

Por lo tanto, por definición, una entidad separada ya se ha persistido, y yo realmente no creo que esta es su verdadera cuestión. Ahora, si usted quiere saber si una entidad es nueva (es decir, no tiene ninguna identidad persistente), lo que acerca de esto:

@Transient 
public boolean isNew() { 
    return (this.id == null); 
} 
+0

Absolutamente, quiero saber si mi entidad es nueva.Preferiría utilizar otro campo con un valor predeterminado establecido en la base de datos, ya que no estoy utilizando una estrategia JPA GeneratedValue para la clave primaria (me estoy estableciendo la clave principal con un UUID para la implementación de proveedor de bases de datos cruzadas/compatibilidad con clústeres) – snowflake

+2

@snowflake El problema es que JPA no admite valores generados por la base de datos para atributos no pk, por lo que deberá usar una extensión de proveedor JPA (como '@ org.hibernate.annotations.Generated') o actualizar sus entidades después de persistir , que es feo Me pregunto si usar '@ GeneratedValue' no sería una mejor opción. –

+0

Gracias por tu comentario. Tienes razón, esto es feo, preferiría usar como alternativa un campo establecido en y por mi DAO. – snowflake

Cuestiones relacionadas