Im Feld stocks der Bot entity wird mein stock repository durchsucht, das nach allen stocks in dem Feld bot_id nach der aktuellen id des Bots sucht. Damit möchte ich eben in die Liste alle Stocks reinschreiben, die zu diesem Bot gehören. Das funktioniert auch, wenn ich allerdings einen Bot löschen möchte, dann geht das nicht und ich bekomme diesen Fehler:
Code:
ERROR: update or delete on table "bots" violates foreign key constraint
Wie kann ich die Beziehung so setzen, dass wenn ich einen Bot lösche automatisch alle Stocks, die zu ihm gehören auch gelöscht werden und ich nicht diese exception bekomme?
Das orphanRevoval = true und den cascadeType.ALL hat er ja beides.
Daher frage ich mich gerade, ob es nicht evtl. an algorithms liegen könnte.
Da könnte dann ggf. eine Annotation wie @org.hibernate.annotations.Cascade(org.hibernate.annotations.CascadeType.ALL)
ein Versuch wert sein.
So wie ich das verstanden habe ist das Problem, dass ich ja einfach nur die Ids abfrage und das mit dem Constraint nur funktioniert, wenn ich den kompletten Bot im Stock entity referenzieren würde... Ich finde es macht aber halt keinen Sinn den Bot im Stock zu "verbinden". Was ich mir gedacht habe, ist dass ich die deleteById Funktion aus dem repo überschreibe und dann dort eben immer die Stocks, die auch gelöscht werden müssen davor eben lösche. Dabei bekomme ich aber denselben Fehler.
Das orphanRevoval = true und den cascadeType.ALL hat er ja beides.
Daher frage ich mich gerade, ob es nicht evtl. an algorithms liegen könnte.
Da könnte dann ggf. eine Annotation wie @org.hibernate.annotations.Cascade(org.hibernate.annotations.CascadeType.ALL)
ein Versuch wert sein.
Das hat leider auch nicht geholfen... Ich glaube, dass es was damit zu tun hat, da ich nicht den ganzen Bot referenziere, sondern eben nur die Bot id und dann greift das Constraint aus irgendeinem Grund nicht.
Hab das jetzt mit getter und setter ersetzt, hat aber das Problem natürlich auch nicht behoben. Ich versteh auch garnicht, warum das so kompliziert ist eine gute Lösung zu finden. Ich meine das kommt doch tausendfach vor, dass man in einer entity die id einer anderen entity hinterlegt...
Meist hinterlegt man entweder die direkte referenz oder macht es in beiden Richtungen nur über die ID. Diesen Mischmasch - A nach B über Objektreferenz, aber B nach A über id habe ich tatsächlich bisher noch nie gesehen
Meist hinterlegt man entweder die direkte referenz oder macht es in beiden Richtungen nur über die ID. Diesen Mischmasch - A nach B über Objektreferenz, aber B nach A über id habe ich tatsächlich bisher noch nie gesehen
Die hast du doch bereits geschaffen. Ich würde sagen entweder kennt stock das Bot Objekt oder nicht mal die Id - aber diesen Mischmasch halte ich für falsch. Das Problem ist, aus Sicht von JPA hast du eine Spalte in Stock, die eine zweifache Bedeutung hat - bot_id.
Das ist einmal ein reines Long-Attribut des Stock Objektes - ohne weitere Bedeutung.
Zum anderen ist es aber auch die Spalte, in der Bot die Rück-Referenz reinspeichert.
Diese beiden Bedeutungen sind getrennt. Ich vermute mal stark, dass sich JPA deswegen lang legt, weil es kann ja die Spalte z.B. nicht auf null setzen, nur weil ein Bot gelöscht wird. Schließlich ist in der Spalte ein Attribut von Stock gespeichert, was nix mit Bot zu tun.