MySQL Trigger löst nicht aus bei Hibernate Update

OnDemand

Top Contributor
Hallo zusammen,

hab einen Trigger "After Update" auf eine double Spalte, welche nicht auslöst, wenn das Programm den entsprechenden Wert updated.

Wenn ich den Wert in der DB manuell ändere, löst der Trigger aus. Nur wenn Hibernate das Update auf den Wert macht, passiert nix.

Hier der Trigger:

Code:
create definer =user@`%` trigger update_price
after UPDATE on prices
for each row
BEGIN
  IF NEW.vk_price_netto <> OLD.vk_price_netto THEN
    insert into update_log (product_id, updated_field, old_value, new_value) values (NEW.id, 'PPRC', OLD.vk_price_netto, NEW.vk_price_netto);
  END IF;
END;
 
Huhu, mir fiel jetzt auf, dass der Trigger scheinbar doch irgendwann aufgerufen wird. Meine update table hat nun alles drin.

Die Änderungen werden sofort geschrieben, das sehe ich. Aber möglicherweise wird erst später geflushed/commited?
nutze Spring Boot, weiß da nicht genau, wie es wann was macht. Wenn ich mit repository.saveAndFlush() arbeite, wird es auch nicht sofort getriggered. Hast du noch eine Idee?
 
Der Trigger hat doch nicht ausgelöst. Ich habe update prices set price =0 gemacht um die preise für testzwecke zu nullen. Dieses Update hat den Trigger ausgelöst, nicht aber das Update von Hibernate 🙁
 
Nein ist 0 als 0,00

Hab mir jetzt nochmal, die Queries nochmal genauer angesehen:
Hibernate macht ein delete und dann ein insert, dann kein Wunder. Aber warum macht es nicht ein Update? So kann ich mir nicht triggern, was old und was new ist 🙁
Liegt vermutlich an den Relations der Entities oder?

Kann da einen Workaround machen, aber ein Update wäre mir schon lieber
 
Wie folgt:

Produkt.java:
@OneToMany(orphanRemoval = true, cascade = {CascadeType.ALL})
@LazyCollection(LazyCollectionOption.FALSE)
@JoinColumn(name = "product_id")
private List<Preis> productsPreise = new ArrayList<>();

auf der Preis-Seite gibts keine Referenz auf das Produkt. Jeweils Getter Setter, Konstruktor etc, alles da
 
PreisEntity hat nur ek und vk Preis und die ID:

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id")
private int id;

so sieht auch die ID im Produkt aus
 
Wie aktualisierst Du denn den Preis? Rufst Du einen Setter auf der PreisEntity auf oder setzt Du ein Objekt in productsPreise-List? Falls letzteres: wo kommt das PreisEntity-Objekt her?
 
Das Problem wird sein, dass das Preis-Objekt zum Zeitpunkt des Speicherns noch transient (neu) und damit dem EntityManager noch unbekannt ist. Der geht dann von einer neuen Entity aus, entfernt die alte und fügt die neue ein. Du müsstest Dir die Preis-Entity vorher aus der DB holen und ändern oder das neue Objekt mergen und das gemergte Objekt verwenden.
 

Zurück
Oben