2016-06-30 7 views
0

Ich arbeite in einem Frühjahr Projekt, wo ich Hibernate 3.5.5-Final und meine Datenbank ist MySQL. Mein Code ist untenKann nicht Daten mit Sql-Formular Frühling Hibernate mit createSQLQuery (sql). ExecuteUpdate()

String sql = "INSERT INTO recently_sold_products (product_id, sell_time) VALUES ('9749', '2016-06-01 00:00:00')"; 
    Query query = getCurrentSession().createSQLQuery(sql); 
    System.out.println("Updating recently sold products. Row = " + query.executeUpdate()); 

Dies gibt mir eine Ausgabe wie

Aktualisierung kürzlich verkauften Produkte. Zeile = 1

Aber wenn ich die Datenbanktabelle überprüfe, fand ich keine Zeile.

In dieser Tabelle ist product_id der Primärschlüssel. Wenn ich versuche, eine doppelte product_id einzufügen, dann habe ich die Fehlermeldung gefunden, Duplicate-Eintrag '9749' für Schlüssel 'PRIMARY', die bestätigen, dass die Abfrage in der Datenbank erreichen. Wenn ich jedoch versuche, eine normale Zeile einzufügen, ist die Ausgabe der executeUpdate() -Methode 1, aber keine Zeileneinfügung in der Tabelle.

Ich kann nicht verstehen, was passiert.

+3

Sieht so aus, als würde Ihr Code kein commit machen. – Jens

+0

Ich würde empfehlen, die Art der Abfrage zu ändern, so dass Sie Sitzungen, Transaktionen und Objekte statt nur einer einfachen Abfrage verwenden. Andernfalls sollten Sie etwas wie session.getTransaction() machen. Commit() Dabei ist Sitzung Ihre aktuelle Sitzung. getCurrentSession() kann hier funktionieren. –

+0

Endlich ist das Problem gelöst. Ich benutze @Transactional vor der Methode. –

Antwort

1

Alles scheint in Ordnung, aber das Problem ist, Rollbacks ein Commit nach der Insert-Anweisung zu senden. Nach executeUpdate; hinzufügen:

connection.commit(); //Whatever you are using as con. string. 
+0

Wo finde ich das Verbindungsobjekt? –

0

Von dem, was wenig ich weiß Hibernate über würde es scheinen, dass Sie sollten Ihre Sitzungen und Transaktionen sorgfältig zu steuern.

Einige Bibliotheks- oder Datenbankkonfigurationen ermöglichen es Ihnen, mehrere Abfragen in einer Sitzung auszuführen, ohne die Daten zu übergeben und zukünftigen Sitzungen zu ermöglichen, die vorgenommenen Änderungen zu sehen. Was geschieht, ist, dass Sie Daten in der Sitzung ändern, dann aber die Sitzung beenden und die Daten zurückrollen, sodass keine anderen Sitzungen sie sehen können (dies ist nicht geschehen).

Öffnen Sie eine Sitzung, starten Sie eine Transaktion (oder eine Abfrage), committen Sie Ihre Sitzung, schließen Sie Ihre Sitzung.

Dies ist die Reihenfolge, die Sie tun wollen. Wenn Sie die Sitzung nicht erstellen und sie als Variable speichern, können Sie getCurrentSession(). GetTransaction(). Commit() nach Ihrer Abfrage verwenden, und dies sollte funktionieren, aber Sie kontrollieren Ihre Sitzungen nicht sehr gut, indem Sie dies tun und könnten bekomme seltsame Fehler, wenn etwas hinter den Kulissen nicht in der richtigen Reihenfolge passiert.

Verwandte Themen