2017-09-14 3 views
2

Ich habe eine Entität mit dem Feld createTimestamp. Dies wird von der Datenbank beim Einfügen erstellt. Der Getter sieht wie folgt aus:JPA-Entität CreateTimestamp ist null nach persist

@Column(name = "create_timestamp", columnDefinition = "TIMESTAMP DEFAULT CURRENT_TIMESTAMP", insertable = false) 
public ZonedDateTime getCreateTimestamp() { 
    return createTimestamp; 
} 

Wenn jedoch mein Dienst die dao (Frühjahr Repository) ruft die Einheit zu erstellen, erstellen Sie die Zeitstempel gleich null ist.

Meine dao Methode zu erstellen:

@Override 
public int insert(AntennaSpec antennaSpec) { 
    super.save(antennaSpec); 
    logger.info("Antenna Spec " + antennaSpec.getAntennaCode() + " created"); 
    return antennaSpec.getAntennaSpecId(); 
} 

Meine REST-Ressourcenklasse ruft den Dienst der Einheit zu schaffen, indem die Methode erstellen aufrufen. Die Methode gibt die ID der neu erstellten Entität zurück. In der Ressource rufe ich dann meinen Dienst an, um die Entität zurückzugeben, die die ID übergibt, und dennoch ist der create timestamp null. Was ich getan habe, um dies zu erreichen, ist in meiner Ressource, ich habe die Entität entfernt und dann die Entität erneut abgerufen. Das funktioniert, aber ich mag es nicht, detach für meine Service- oder Ressourcenklassen offen zu legen.

Jede Hilfe wäre willkommen.

+0

Können Sie Ihre Tabelle DDL? Die 'columnDefinition' wird verwendet, wenn Hibernate die Datenbank für Sie generiert. Wenn Sie beispielsweise liquibase verwenden, muss die DDL nicht unbedingt übereinstimmen. – Andreas

+0

Entschuldigung. Ich habe vergessen zu erwähnen, dass Hibernate nicht eingestellt ist, um die Datenbank für mich zu generieren. Nur um zu bestätigen, dass die vorhandene Datenbank mit meinen Entitäten funktioniert. –

+0

Hier ist eine Idee ... Sie sehen sich das SQL der INSERT-Anweisung an und stellen den Leuten die DDL der Tabelle zur Verfügung. Dann Debugging ist möglich ... – DN1

Antwort

0

Dies ist ein weiterer Weg für einen Zeitstempel im Frühjahr erstellen:

@CreationTimestamp 
@Column(name = "create_timestamp") 
private Date createTimestamp; 
+0

statt Datum verwende ich Java 8's 'ZonedDateTime', die erscheint, funktioniert es nicht mit' @ CreationTimestamp' –

0

Es sieht aus wie Sie die Anmerkung @Temporal(TemporalType.TIMESTAMP) auf Ihre Spalte in der Antwort here wie besprochen hinzufügen möchten.

Suchen Sie nach here für weitere Informationen darüber, wie Persistence, Speichern, Aktualisieren, Zusammenführen und SaveOrUpdate für verschiedene Objektstatus unterschiedlich ausführen.

+0

Leider verwende ich nicht 'java.util.Date' sondern stattdessen' ZonedDateTime'. –

0

columnDefinition hat nur einen Effekt, wenn Sie Hibernate die Datenbank generieren lassen; sonst wird es einfach ignoriert. Ändern Sie einfach Ihre Spalte über Ihr Datenbankmigrationstool in den gewünschten Status.

Column

(optional) Die SQL-Fragment, das verwendet wird, wenn für die Spalte den DDL erzeugen.