Wie zu imitieren upsert Verhalten mit Hibernate?
Ich Schreibe eine Anwendung, die sync-Entitäten, die von einer Dritten Partei datasource in unser eigenes schema, mit dem eine transformation/mapping-Schritt in zwischen. Ich bin mit Hibernate zu vertreten und beibehalten der Personen in unser eigenes schema. Ein problem, das ich gelaufen bin, ist, dass ich eine einzigartige multi-column key auf einem meiner Tische. Das Verhalten würde ich gerne sehen, ist Analog zu einer upsert: wenn Hibernate geht zu persistieren einer Entität und erkennt eine Verletzung der unique-Einschränkung, es hat ein update statt. Wir verwenden MySQL, die eine INSERT ... ON DUPLICATE KEY UPDATE syntax, aber ich bin mir nicht sicher, wie oder ob Hibernate gemacht werden kann, es zu nutzen?
Ich glaube, ich könnte versuchen Sie immer, den Sie einfügen, und wenn ich zu fangen eine Ausnahme machen Sie ein update, aber das scheint hacky und suboptimal. Irgendwelche Tipps, auf eine saubere Art und Weise, dies zu tun?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Sieht es aus wie jemand es Tat durch überschreiben der
sql-insert
Aussage von Hibernate verwendet für diese Entität. Wenn Sie nichts dagegen haben, nicht tragbar (und wahrscheinlich verwenden Sie eine gespeicherte Prozedur), haben einen Blick.Andere option wäre:
Aber es sei denn, Sie sperren die ganze Tabelle(N), die während des Prozesses, können Sie Gesicht einige race-Bedingung in einer Multithread-und verteilten Umgebungen und Schritt #3 kann möglicherweise fehlschlagen. Stellen Sie sich zwei parallele threads:
Thread 1:
Thread 2:
So würden Sie implementieren müssen, um eine Art retry-Mechanismus jedenfalls (sperren der gesamten Tabelle(N) ist nicht eine gute option, IMO).
Race-Bedingung kann vermieden werden, indem Sie "select ... for update"