Impostare la creazione e tempo di aggiornamento con Hibernate in mappature Xml
-
26-09-2019 - |
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
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 .