2017-01-06 3 views
0

Ich entwickle gerade eine Web-Anwendung mit Spring, Hibernate und Mysql. Das Problem bestand darin, allen Objekten einen Zeitstempel created_at und updated_at hinzuzufügen.Hibernate und Mysql Objekt aktualisiert keine Timestamp Spalte

Ich habe folgende abstrakte @ MappedSuperclass:

@MappedSuperclass 
public abstract class AbstractTimestampEntity { 

    @Temporal(TemporalType.TIMESTAMP) 
    @Column(name = "created_at", nullable = false) 
    private Date created; 

    @Temporal(TemporalType.TIMESTAMP) 
    @Column(name = "updated_at", nullable = false, updatable = false) 
    private Date updated; 
... 
} 

Und in Mysql definiert CURRENT_TIMESTAMP für created_at und CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP für updated_at.

Wenn ich es manuell testen, funktioniert es gut nach dem Einfügen eines Objekts und Aktualisieren der Zeiten in Mysql sind korrekt. Ich wollte jedoch automatische Tests schreiben und die Werte nicht aus der DB abrufen und das Objekt aktualisieren.

Es führt zu einer Nullpointer-Ausnahme, da das Datum des Test1-Objekts nie festgelegt wird. (Tester1 Objekt erstreckt AbstractTimestampEntity)

ich manuell das Datum mit einer SQL-Abfrage abgerufen:

SQLQuery sqlQuery = sessionFactory.getCurrentSession().createSQLQuery("SELECT updated_at FROM smarterTestDB.User WHERE userId="+tester1.getUserId()); 
sqlQuery.setResultTransformer(Criteria.ALIAS_TO_ENTITY_MAP); 
List list = sqlQuery.list(); 
String test = list.get(0).toString(); 

Und es gab mir den eingestellten Wert von mysql: Datum: {updated_at = 2017.01.06 12 : 25: 59.0}

Warum schreibt es nicht in das Objekt? Und es gibt keinen Fehler über TypeMissmatch oder ähnliches. Wird das @Temporal (TemporalType.TIMESTAMP) nicht von sql.Timestamp in util.Date konvertiert?

Mit freundlichen Grüßen


Update:

ich den Fehler bekam durch das Objekt an die userResource vorbei konstruieren ich die UserDAO der Benutzer tatsächlich senden würde widersprechen. Dieser wird aktualisiert, aber nicht das ursprüngliche Benutzerobjekt, solange es nicht neu aus der Datenbank abgerufen wird. Einfacher Pass by Referenz/Wert Fehler.

+0

Versuchen Sie es mit einer 'javax.persistence.Version' Annotation in ein' java.sql.Timestamp' Feld. Ich bin auch nicht sicher, ob das "updatable = false" auf dem Feld Probleme verursachen wird, aber Sie brauchen es nicht wirklich. – coladict

+0

Ich habe versucht @ @Version @Column (name = "aktualisierte_at", nullable = false, updatable = false) privaten Timestamp aktualisiert; 'Es hat immer noch den gleichen Fehler. Das 'updateable = false 'habe ich gesetzt, weil mysql irgendwie nicht aktualisiert wurde, wenn der übergebene Wert nicht null war. – kaikun

Antwort

0

Änderungen, die von der Datenbank vorgenommen werden (wie CURRENT_TIMESTAMP oder eine beliebige Art von Trigger), werden von der Entität, die Sie speichern möchten, nicht erkannt. Alle Änderungen müssen von der Java-Anwendung vorgenommen werden. Auf diese Weise werden die korrekten Werte in der Datenbank und in Ihrer Entität angezeigt, ohne dass eine Aktualisierung durchgeführt wird. Ich habe den folgenden Code verwendet.

@Column(nullable = false) 
@Temporal(TemporalType.TIMESTAMP) 
@Version 
private Date updated_at; 

Die Datenbankspalte ist ein einfaches "TIMESTAMP" ohne weitere Funktionalität.

Also die Datenbank hat keine Logik, alles wird von der Anwendung an einem Ort erledigt. Die Anwendung ist verantwortlich für alle Änderungen. Die Pflege Ihres Codes wird auf diese Weise einfacher.

+0

Ok Ich kann die Funktionalität in die Anwendung verschieben, was wahrscheinlich der bessere Weg ist.(wollte 'PrePersist' und' PreUpdate' verwenden, funktioniert aber nicht, wenn ich die Session API benutze) Allerdings sollte es immer noch so funktionieren, da ich die Entity aktualisiere, welche die Daten aus der Datenbank holt und den generierten Timestamp von Mysql no? – kaikun

+0

Gibt es einen Commit-Befehl? Vielleicht setzt mysql die Zeitstempel kurz vor dem Commit. – jaysee

+0

Es sollte "committed" werden, wenn ich aktualisiere oder aktualisiere, wenn ich dich richtig interpretiere – kaikun

Verwandte Themen