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