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

Était-ce utile?

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 .

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top