Frage

Ich verwende Hibernate mit XML Abbildungen. Ich habe eine Entität, die zwei Felder hat creation und updateDate vom Typ timestamp, die mit der aktuellen UTC-Zeit gefüllt werden müssen, wenn das Unternehmen beibehalten und aktualisiert wird. Ich weiß um die Existenz der @PrePersist und @PreUpdate Anmerkungen, aber ich weiß nicht, wie sie ihre äquivalenten Zuordnungen in meinem XML verwenden.

Noch einmal, ich frage mich, ob Hibernate unterstützt irgendwie nativ das Update und Erstellungszeit einstellen.

Danke

War es hilfreich?

Lösung

  

Ich weiß um die Existenz der @PrePersist und @PreUpdate Anmerkungen, aber ich weiß nicht, wie sie ihre äquivalenten Zuordnungen in meinem XML verwenden.

Event-Architektur bietet gleichwertig etwas und man konnte registrieren Zuhörer für PreInsertEvent, PreUpdateEvent oder SaveOrUpdateEvent (siehe org.hibernate.event Paket für eine vollständige Liste) zu setzen und aktualisieren, die erstellen / aktualisieren Daten.

Ein weiterer Ansatz wäre, ein Interceptor , entweder Session-scoped oder SessionFactory-scoped und sowohl createDate und updateDate in onSave(...) zu setzen, die updateDate in onFlushDirty(...) aktualisieren.


Update:. Ich meine ursprünglichen Vorschläge unten verlassen, aber ich denke, dass der richtige Ansatz (sollte meine erste Antwort gewesen) einen Abfangjäger oder die Event-Architektur zu verwenden,

Sie könnten den verwenden generated Attribut des timestamp bekommen creationDate und updateDate von der Datenbank generiert auf einfügen und auf einfügen und aktualisieren jeweils:

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

siehe den Abschnitt erzeugt Eigenschaften für weitere Informationen.

Option 1

Es scheint, dass timestamp nicht unterstützt <> generatead so mein Vorschlag wird nicht funktionieren. Dennoch genauer die Dokumentation gelesen zu haben, mein Verständnis ist, dass timestamp ist eine Alternative zur Versionierung und ich glaube nicht, dass es eine geeignete Wahl ist für Felder wie createDate und < strong> updateDate (es kann für die spätere Arbeit, aber das ist nicht das, was timestamp für ist).

Also ich würde eigentlich noch benutzen erzeugt Eigenschaften und mit einfache Eigenschaften anstelle von 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>

Auf Datenbankebene, würde dies erfordert einen Trigger für updateDate Spalt. Für die createDate Säule würde mit so etwas wie current_timestamp als Standardwert gut funktionieren. Aber Auslöser sind vielleicht nicht gesucht ...

Option 2

Um den Abzug der zu vermeiden Option 1 , eine Variation wäre updateDate zu verwenden für Versionsverwaltung (und somit als timestamp Karte):

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

Die gleiche Ansatz wie Option 1 für createDate, verwenden Sie einen Standardwert auf Datenbankebene.

Option 3

Sehen Sie den Anfang der Antwort ...

Andere Tipps

Zeitstempel in den Ruhezustand sind offenbar immer automatisch aktualisiert, wenn die Einheit ändert, so können Sie keine <timestamp> Mapping für das Erstellungsdatum verwenden. Allerdings können Sie es als eine einfache java.util.Date Eigenschaft speichern, initialisiert es mit new Date().

Für den Update Zeitstempel, versuchen Sie dies:

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

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

Beachten Sie, dass timestamp in der Abbildung rechts nach id kommen muss.

Zu Ihrer Information hier ist ein Referenz des timestamp Attribute .

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top