Domanda

Sto usando Hibernate con XML mappature. Ho un ente che ha due campi creationDate e updateDate di tipo timestamp, che devono essere riempito con l'ora UTC corrente quando l'entità viene mantenuto e aggiornato. Conosco l'esistenza dei @PrePersist e @PreUpdate annotazioni, ma non so come usare il loro equivalente nelle mie mappature XML.

Anche in questo caso, mi chiedevo se in qualche modo Hibernate supporta in modo nativo il set di aggiornamento e ora di creazione.

Grazie

È stato utile?

Soluzione

  

Lo so circa l'esistenza dei @PrePersist e @PreUpdate annotazioni, ma non so come usare il loro equivalente nelle mie mappature XML.

Il Hibernate3 architettura evento fornisce qualcosa di equivalente e si potrebbe registrare ascoltatori per PreInsertEvent, PreUpdateEvent o SaveOrUpdateEvent (vedere il foglio org.hibernate.event per l'elenco completo) per impostare e aggiornare il creare / date di aggiornamento.

Un altro approccio sarebbe quello di utilizzare un intercettore , sia Session scope o SessionFactory con ambito e impostare sia createDate e updateDate in onSave(...), aggiornare il updateDate in onFlushDirty(...).


Aggiornamento:. che sto lasciando la mia suggerimenti originali sotto, ma penso che l'approccio giusto (avrebbe dovuto essere la mia risposta iniziale) è di utilizzare un intercettore o l'architettura evento

è possibile utilizzare il generated attributo del timestamp per ottenere creationDate e updateDate generato dal database su inserire e sul rispettivamente di inserimento e aggiornamento:

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

, fare riferimento alla sezione proprietà generati per tutti i dettagli.

Opzione 1

Sembra che timestamp non supporta generatead quindi il mio suggerimento non funziona. Tuttavia, dopo aver letto la documentazione con più attenzione, la mia comprensione è che timestamp è un'alternativa a versioni e non credo che sia una scelta appropriata per i campi come createDate e < strong> updateDate (si può lavorare per il più tardi, ma non è questo che timestamp è per).

Quindi mi sento in realtà ancora utilizzare proprietà generati ma proprietà semplici invece di 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 livello di database, ciò richiederebbe utilizzando un trigger per la colonna updateDate. Per la colonna createDate, usando qualcosa come current_timestamp come valore di default avrebbe funzionato bene. Ma trigger sono forse non volevano ...

opzione 2

Per evitare il grilletto della 1 , una variazione sarebbe quella di utilizzare updateDate per il controllo delle versioni (e quindi mappare come timestamp):

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

Lo stesso approccio, come Opzione 1 per createDate, utilizzare un valore di default a livello di database.

Opzione 3

vedere la parte superiore di questa risposta ...

Altri suggerimenti

Timestamps in Hibernate sono apparentemente sempre aggiornato automaticamente quando cambia entità, quindi non è possibile utilizzare una mappatura <timestamp> per la data di creazione. Tuttavia, è possibile memorizzare come una semplice proprietà java.util.Date, inizializzato con new Date().

Per il timestamp aggiornamento, provate questo:

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

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

Si noti che timestamp deve venire subito dopo id nella mappatura.

FYI: ecco un riferimento del timestamp attributi .

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top