Mysql
 sql >> Datenbank >  >> RDS >> Mysql

SpringDataJPA speichern OneToOne-Beziehung Abrufen Untergeordnete Zeile kann nicht hinzugefügt oder aktualisiert werden:Eine Fremdschlüsseleinschränkung schlägt fehl

Das Problem ist wahrscheinlich Ihre Strategie zur ID-Erzeugung (vorausgesetzt, Sie haben den Kontakt ordnungsgemäß initialisiert). Das Benutzerobjekt muss in die DB eingefügt werden, damit seine ID festgelegt wird, aber gleichzeitig benötigt der Kontakt diese ID, um ein gültiges Objekt zu sein. Beide müssen dies tun in derselben Transaktion passieren.

Wenn Sie die Protokollierungsebene für Ihr JPA (in perstitance.xml) auf fein umstellen, sehen Sie höchstwahrscheinlich die Sequenz zum Einfügen des Benutzers und des Kontakts, aber der Kontakt hat die Benutzer-ID 0.

a) Stellen Sie also sicher, dass Sie den Benutzer explizit in Ihrem Kontakt festlegen (wie Sie sagten, wird die Beziehung von Contact verwaltet. b) Legen Sie den Kontakt für den Benutzer fest. c) bestehen bleiben (in einer Transaktion). Abhängig von Ihrer JPA-Implementierung funktioniert es möglicherweise immer noch nicht (überprüfen Sie die ausgegebenen Abfragen, höchstwahrscheinlich wird bei Kontakt eingefügt und dann aktualisiert). Ändern Sie die Generierungsstrategie auf TABLE, mit TABLE nimmt JPA die nächste freie ID, weist sie dem Objekt zu und führt die Einfügung durch, damit sie vor der Einfügung "bekannt" ist.