Set-Erstellung und Aktualisierungszeit mit Hibernate in XML-Mappings
-
26-09-2019 - |
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
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 .