Pregunta

Estoy usando Hibernate con XML asignaciones. Tengo una entidad que tiene dos campos fechaCreacion y updateDate de tipo timestamp, que tiene que ser llenado con la hora UTC actual cuando la entidad se conserva y se actualiza. Yo sé de la existencia de las anotaciones @PrePersist y @PreUpdate, pero no sé cómo usar su equivalente en mis asignaciones XML.

Una vez más, me preguntaba si de algún modo Hibernate soporta de forma nativa la actualización y hora de creación conjunto.

Gracias

¿Fue útil?

Solución

  

Yo sé de la existencia de las anotaciones @PrePersist y @PreUpdate, pero no sé cómo usar su equivalente en mis asignaciones XML.

El arquitectura de eventos proporciona algo equivalente y se podía registrar detectores para PreInsertEvent, PreUpdateEvent o SaveOrUpdateEvent (véase el paquete org.hibernate.event para obtener una lista completa) para establecer y actualizar el crear / fechas de actualización.

Otro enfoque sería el uso de un interceptor , ya sea Session de ámbito o SessionFactory con ámbito y para establecer tanto createDate y updateDate en onSave(...), actualizar el updateDate en onFlushDirty(...).


Actualización:. estoy dejando mis sugerencias originales de abajo, pero creo que el enfoque correcto (debería haber sido mi primera respuesta) es utilizar un interceptor o la arquitectura de eventos

Usted puede utilizar el generated atributo de la timestamp para obtener creationDate y updateDate generado por la base de datos en insertar y de inserción y actualización, respectivamente:

<class name="MyEntity" table="MY_ENTITY">
  <id .../>
  <timestamp name="createDate" generated="insert" ... />
  <timestamp name="updateDate" generated="always" ... />
  ...
</class>

Consulte la sección propiedades generadas para más detalles.

Opción 1

Parece que timestamp no soporta generatead así que mi sugerencia no funcionará. Sin embargo, después de haber leído la documentación con más cuidado, mi opinión es que timestamp es una alternativa a la versión y no creo que es una opción apropiada para campos como createDate y < strong> updateDate (que puede funcionar para la tarde, pero eso no es lo que es para timestamp).

Así que yo en realidad todavía utilizar propiedades generadas pero con propiedades simples lugar de timestamp :

<class name="MyEntity" table="MY_ENTITY">
  <id .../>
  <property name="createDate" update="false" insert="false" generated="insert" ... />
  <property name="updateDate" update="false" insert="false" generated="always" ... />
  ...
</class>

A nivel de base de datos, esto requeriría el uso de un disparador para la columna updateDate. Para la columna de createDate, usando algo como current_timestamp como valor por defecto podría funcionar muy bien. Pero desencadenantes son quizás no querían ...

Opción 2

Para evitar el gatillo de la Opción 1 , una variación sería utilizar updateDate de versiones (y por lo tanto el mapa como timestamp):

<class name="MyEntity" table="MY_ENTITY">
  <id .../>
  <timestamp name="updateDate" ... />
  <property name="createDate" update="false" insert="false" generated="insert" ... />
  ...
</class>

El mismo que la opción 1 para createDate, utilice un valor por defecto a nivel de base de datos.

Opción 3

Ver la parte superior de esta respuesta ...

Otros consejos

Las marcas de tiempo en Hibernate son aparentemente siempre se actualiza automáticamente cuando cambia la entidad, por lo que no pueden utilizar un mapeo <timestamp> de la fecha de creación. Sin embargo, se puede almacenar como una simple propiedad java.util.Date, inicializado con new Date().

En la fecha y hora de actualización, intente lo siguiente:

public class MyEntity {
  ...
  private Date updateDate;
  ...
}

<class name="MyEntity" table="MY_ENTITY">
  <id .../>
  <timestamp name="updateDate" access="field" column="UPDATE_DATE"/>
  ...
</class>

Tenga en cuenta que timestamp debe venir inmediatamente después id en el mapeo.

Para su información que aquí hay una referencia de la timestamp atributos .

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top