2013-02-05 10 views

Antwort

53

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 .

+1

Vielen Dank für die sehr detaillierte Erklärung Xavi zu aktualisieren. Das ist mehr als meine Erwartung und es funktioniert! – BruceCui

+0

@ user1900240 Froh, dass geholfen hat :) –

+0

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. –

0

Oder Sie können die Eigenschaft des pojo direkt initialisieren z

// Java-Code Eigenschaft Erklärung

private String Nachname = "default";

+0

Es funktioniert für Zeichenfolge und nicht Datum Werte – rajadilipkolli

1

Einfach einführbar = false in Sie @Column Definition

sehen diese link für weitere Informationen

9

Wenn Sie Hibernate verwenden, dann können Sie nur @CreationTimestamp verwenden Standarddatum einzufügen.

@CreationTimestamp 
@Temporal(TemporalType.TIMESTAMP) 
@Column(name = "create_date") 
private Date createDate; 

und @UpdateTimestamp den Wert bei Bedarf

@UpdateTimestamp 
@Temporal(TemporalType.TIMESTAMP) 
@Column(name = "modify_date") 
private Date modifyDate; 
+0

Dies tat es für mich - auf der Suche nach dieser Antwort für eine Weile! Danke, @rajadilipkolli :) – Custard

+0

Arbeiten diese mit java 8's 'ZonedDateTime'? –

+0

Das hat bei mir funktioniert, die erste Antwort hat nicht funktioniert. Danke @rajadilipkolli – Doug

Verwandte Themen