Der Grund, warum die Datumsspalte einen null
Wert werden beim Einsetzen, obwohl es als default SYSDATE
dbms-Seite definiert ist, dass der default
Wert für eine Spalte nur, wenn der Spalt Wert nicht angegeben wird, in der Abfrage verwendet wird . Das heißt, es darf nicht im Satz INSERT INTO
erscheinen, auch wenn es null
ist.
Wenn Sie die default SYSDATE
auf dem DBMS Seite verwenden möchten, sollten Sie die @Column
mit insertable=false
konfigurieren, um die Spalte aus Ihrer SQL INSERT
s zu erhalten.
@Temporal(TemporalType.TIMESTAMP)
@Column(name = "myDate", insertable=false)
private Date myDate;
berücksichtigen, dass dieser Ansatz immer den Wert ignorieren Sie in Ihrer Anwendung auf die Eigenschaft bereitstellen, wenn das Unternehmen zu schaffen. Wenn Sie das Datum wirklich manchmal bereitstellen möchten, sollten Sie vielleicht einen DB-Trigger verwenden, um den Wert anstelle eines Standardwerts festzulegen.
Es gibt eine Alternative zur Verwendung der default SYSDATE
Definition des DBMS. Sie könnten die @PrePersist
und @PreUpdate
Anmerkungen verwenden Sie das aktuelle Datum der Eigenschaft zuweisen, vor/Update zu speichern, wenn und nur wenn es noch nicht vergeben wurde:
bietet
@PrePersist
protected void onCreate() {
if (myDate == null) { myDate = new Date(); }
}
Diese eng verwandte Frage unterschiedliche Ansätze: Creation timestamp and last update timestamp with Hibernate and MySQL .
Vielen Dank für die sehr detaillierte Erklärung Xavi zu aktualisieren. Das ist mehr als meine Erwartung und es funktioniert! – BruceCui
@ user1900240 Froh, dass geholfen hat :) –
insertable = false hat nicht für mich gearbeitet. Ich benutze Postgres und ich habe einen Standardwert für die Spalte, aber es wird als null angezeigt. –