Définir la création et le temps de mise à jour avec Hibernate dans mappings Xml
-
26-09-2019 - |
Question
J'utilise Hibernate avec Xml applications. J'ai une entité qui a deux champs creationDate et UpdateDate de type timestamp
, qui doivent être rempli avec l'heure UTC lorsque l'entité est conservé et mis à jour.
Je sais que l'existence des annotations de @PrePersist
et @PreUpdate
, mais je ne sais pas comment utiliser leur équivalent dans mes correspondances Xml.
Encore une fois, je me demandais si Hibernate supporte nativement en quelque sorte l'ensemble de mise à jour et l'heure de création.
Merci
La solution
Je sais que l'existence des annotations de
@PrePersist
et@PreUpdate
, mais je ne sais pas comment utiliser leur équivalent dans mes correspondances Xml.
Le architecture événement fournit quelque chose d'équivalent et vous pouvez enregistrer des écouteurs pour PreInsertEvent
, PreUpdateEvent
ou SaveOrUpdateEvent
(voir le paquet org.hibernate.event
pour une liste complète) pour définir et mettre à jour la création / dates de mise à jour.
Une autre approche serait d'utiliser intercepteur , soit Session
scope ou scope SessionFactory
et à définir à la fois createDate
et updateDate
dans onSave(...)
, mettre à jour le updateDate
dans onFlushDirty(...)
.
Mise à jour:. Je quittais mes suggestions originales ci-dessous, mais je pense que la bonne approche (aurait dû être ma réponse initiale) est d'utiliser un intercepteur ou l'architecture d'événements
Vous pouvez utiliser le generated
attribut timestamp
pour obtenir creationDate
et updateDate
généré par la base de données insérer et à l'insertion et la mise à jour respectivement:
<class name="MyEntity" table="MY_ENTITY">
<id .../>
<timestamp name="createDate" generated="insert" ... />
<timestamp name="updateDate" generated="always" ... />
...
</class>
Reportez-vous à la section propriétés générées pour plus de détails.
Option 1
Il semble que timestamp
ne prend pas en charge generatead
si ma suggestion ne fonctionnera pas. Cependant, après avoir lu la documentation plus attentivement, je crois comprendre que timestamp
est une alternative à versioning et je ne pense pas que ce soit un choix approprié pour les champs comme createDate
et < strong> updateDate
(il peut fonctionner au plus tard, mais ce n'est pas ce que timestamp
est pour).
Je voudrais utiliser effectivement encore propriétés générées mais propriétés simples au lieu 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>
Au niveau de la base de données, cela nécessiterait l'aide d'un déclencheur pour la colonne de updateDate
. Pour la colonne createDate
, en utilisant quelque chose comme current_timestamp
comme valeur par défaut fonctionnerait bien. Mais les déclencheurs sont peut-être pas voulu ...
Option 2
Pour éviter le déclenchement de la balise 1 , une variante serait d'utiliser updateDate
pour versioning (et la carte ainsi que timestamp
):
<class name="MyEntity" table="MY_ENTITY">
<id .../>
<timestamp name="updateDate" ... />
<property name="createDate" update="false" insert="false" generated="insert" ... />
...
</class>
Une même approche que l'option 1 pour createDate
, utilisez une valeur par défaut au niveau de la base de données.
Option 3
Voir haut de cette réponse ...
Autres conseils
Horodatage en veille prolongée sont apparemment toujours mis à jour automatiquement lorsque les modifications de l'entité, vous pouvez donc pas utiliser une cartographie <timestamp>
pour la date de création. Cependant, vous pouvez l'enregistrer comme un simple propriété java.util.Date
, initialisé avec new Date()
.
Pour l'horodatage de mise à jour, essayez ceci:
public class MyEntity {
...
private Date updateDate;
...
}
<class name="MyEntity" table="MY_ENTITY">
<id .../>
<timestamp name="updateDate" access="field" column="UPDATE_DATE"/>
...
</class>
Notez que timestamp
doit venir juste après id
dans le mapping.
est ici un FYI référence des attributs timestamp
.