| 

.NET C# Java Javascript Exception

Update von composite-id, die gleichzeitig Fremdschlüssel ist

Dies ist das Archiv des ehemaligen Forums zum Thema Groovy, Grails, Griffon und Bean Scripting Framework, welches unter groovy-forum.de existierte. Die neue Adresse des Groovy-Forums ist: http://codekicker.de/fragen/themen/groovy.


Update von composite-id, die gleichzeitig Fremdschlüssel ist

milkyman - 03.04.2008 23:05
Hallo,

ich versuche verzweifelt ein Update eines Datensatzes.
Der Datensatz "Recht" besteht aus drei Primärschlüsselfeldern Projekt, Person und Rolle(=Level). Für jedes dieser Felder gibt es jeweils eine andere Tabelle, in der die Detaildaten stehen. In der Tabelle Recht sind jeweils nur die IDs enthalten. D.h. Recht hat einen composite-id key

Grails:
	static mapping = {
      		id composite:['person', 'project', 'level']
  	}

Hibernate:
        <composite-id>
    		<key-many-to-one name="project" class="Project" column="FK_PROJECT_ID"/>
    		<key-many-to-one name="person" class="Person" column="FK_PERSON_ID"/>
    		<key-many-to-one name="level" class="AccessLevel" column="FK_ACCESSLEVEL_ID"/>
	</composite-id>


Anlegen und löschen klappt wunderbar.
Auch das Update der Nicht-Schlüsselfelder funktioniert.
Nur der Update der Schlüsselfelder will nicht. Es kommt zwar keine Fehlermeldung, aber derDatensatz bleibt unverändert.

Right:
	static Right getComposite(String compositeId) {
		return Right.get(
        		new Right(
        			person:Person.get(Right.getPersonFromId(compositeId)), 
        			project:Project.get(Right.getProjectFromId(compositeId)), 
        			level:AccessLevel.get(Right.getLevelFromId(compositeId))
        		) 
        	);
	}

RightController:
params.id enthält die alten Schlüsselfelder im Format k1-k2-k3, getComposite teilt den String und lädt damit das "alte" Objekt.
Mit right.properties = params sollten eigentlich die neuen Werte gesetzt werden. ID und Level werden voller Verzweiflung testweise auch nochmal extra gesetzt. Die Werte sind auch ok, wie mir die flash.message auf der Folgeseite anzeigt. Dort stehen die neuen Schlüsselfelder in der Message. Die Liste (und die Datenbank) zeigt enthält aber nach wie vor nur den alten Stand. Also hat Hibernate den Save nicht durchgeführt.
    def update = {
        def right = Right.getComposite( params.id )
        
        if(right) {
            right.properties = params
            right.id = params.person.id + "-" + params.project.id + "-" + params.level.id
            right.level = AccessLevel.get(params.level.id)
            if(!right.hasErrors() && right.save(flush:true)) {
                flash.message = "Recht mit ID ${right.id} aktualisiert."
                redirect(action:list)
            }
            else {
                render(view:'edit',model:[right:right])
            }
        }
        else {
            flash.message = "Right mit ID ${params.id} nicht gefunden."
            redirect(action:edit,id:params.id)
        }
    }

Also wieso will das Update nicht?

Eine Notlösung wäre vermutlich löschen und neu anlegen?


Stelle deine Groovy-Frage jetzt!


Diese Seite zeigt den Thread "Update von composite-id, die gleichzeitig Fremdschlüssel ist" der ehemaligen Webseite groovy-forum.de, welche durch einen Serverunfall zerstört wurde. codekicker.de hat viele Konversationen über die beliebte Programmiersprache Groovy und zugehörige Frameworks wie das Grails-Framework retten können.

Hast Du eine Frage zum Thema Groovy, Grails oder allgemein Java? Viele ehemalige groovy-forum.de Mitglieder beantworten dir auf codekicker.de deine Frage! Stelle jetzt eine Frage!

Viele weitere Diskussionen zu Grails und Groovy befinden sich auf der Threadübersicht des alten groovy-forum.de.