Warum ist ein Feld mit eindeutiger Einschränkung beim Aktualisieren in Grails fehlgeschlagen?

8

Warum überprüft Hibernate, wenn ich ein benutzerdefiniertes Identitätsattribut in einer Domänenklasse zugeordnet habe, nach eindeutiger Einschränkung? Wenn ich ein Objekt aktualisiere, schlägt die Validierung fehl, obwohl der Wert des gebuchten Feldes mit dem in der DB gespeicherten übereinstimmt! Dies geschieht auch dann, wenn ich das Formular nicht ändere (drecking: false und keine Bindungsfehler). Ich habe eine Grails-Domain-Klasse wie folgt:

%Vor%

Wenn ich jetzt einen Benutzer mit einem Mindestattributsatz erstelle, wird ein Datensatz erstellt. Aber wenn ich versuche das gleiche Objekt zu aktualisieren wie:     def user = Benutzer.findByUsername ('akeel')     user.lastLoginDate = neues Datum ()     user.save (flush: true) Es passiert nichts, weil die eindeutige Validierungsprüfung fehlschlägt. Ich kann die Validierung dadurch umgehen     user.save (validate: false, flush: true) Aber das ist keine Option, da ich den zipCode validieren muss, wenn ein Benutzer es hinzufügt.

Ich musste die Einschränkung für die benutzerdefinierte Identitätsspalte profileId als nullable true festlegen, um das Problem der wiederholten Spalte im Mapping wie vorgeschlagen zu lösen. hier .

Diese Frage ist genau wie die hier besprochene hier , aber die vorgeschlagenen Lösungen funktionierten nicht für mich.

Ich benutze Grails 2.1.2, lassen Sie mich wissen, wenn etwas anderes erforderlich ist, um das Problem zu verstehen.

    
Akeel Faridee 11.02.2014, 05:26
quelle

1 Antwort

4

Es scheint, dass ein benutzerdefinierter Eigenschaftsname für den Primärschlüssel in Grails nicht funktioniert. Ich habe mit Grails 2.0.4, 2.2.4 und 2.3.4 getestet und sie alle erkennen profileId nicht als Primärschlüssel. User.get(1) funktioniert gut, aber user.ident() gibt null zurück. Ich würde sicherlich ein Problem in der Grails JIRA ansprechen.

Die einfachste Lösung besteht darin, die Eigenschaft profileId zu entfernen und stattdessen nur das eingebaute id zu verwenden. Dann entfernen Sie einfach den Wert name: aus der benutzerdefinierten Zuordnung. Mit anderen Worten, Sie sollten mit

enden %Vor%     
Peter Ledbrook 11.02.2014, 10:01
quelle