| 

.NET C# Java Javascript Exception

Löschen bei einer 1 zu 1 Beziehung

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.


Löschen bei einer 1 zu 1 Beziehung

cleo - 11.03.2008 15:33
Holla,

ich schon wieder. Hab mal wieder ein Problem mit dem lustigen Löschen. 2 Klassen die untereinander eine 1 zu 1 Beziehung haben.
Schaut so aus:

class Team {
.
.
. 
Employee leader

	static constraints = {
		leader(blank:false)
        }

}

class Employee{
    String Name
.
.
.
}

Wenn ich das Team lösche, wird der Employee mit gelöscht. Warum das passiert ist klar. Nur.. wie kann ich das verhindern?
Jegliche versuche mit clear, removeFrom.. etc. etc. schlugen fehl. Selbst zusammengefriggelte Statements hat er auch nicht wirklich geschluckt. Hat jmd eine Idee?


Re: Löschen bei einer 1 zu 1 Beziehung

LaermTot - 11.03.2008 16:40
Kann es sein, dass du in deinem Employee ein

static belongsTo = [blup:Team]

hast ?? Falls dem so ist, ist dein beschriebenes Verhalten explizit erwünscht.

Gruß

Volgrr


Re: Löschen bei einer 1 zu 1 Beziehung

cleo - 12.03.2008 07:54
Naaa shit.. doch hast recht.. steht schon mit drin aber für eine andere Aufgabe.. Total verpeilt! Sorry..

Also dann erkläre ich nochmal richtg:

Ich hab 2 Klassen Employee und Team

class Employee {
	
	String firstName
	String lastName

	static belongsTo = Team
	static hasMany = [teams:Team]

Das belongsTo sollte eigentlich nur für das hasMany greifen.. eigentlich..

Team sieht dann so aus
class Team {
	String teamName
	Employee leader
	Employee substitute

	static hasMany = [employees:Employee]

hat jmd ne Idee, wie das funktioneren könnte, wenn ich n Team lösche, dass der Leader und Substitute nich mitgelöscht wird?

Für die hasMany hab ich folgenden Code eingebaut und das funktioniert auch super..

Delete-Funk.
        def team = Team.get( params.id )
        if(team) {
		team.employees.each(){
		def employee = Employee.get(it.id)
		team.removeFromEmployees(employee)
	  }
  	  team.refresh()
	  team.delete()


Re: Löschen bei einer 1 zu 1 Beziehung

panther - 12.03.2008 08:43
Probier mal das Folgende, ob es sich dann so verhält wie du willst:
class Team {
    
    String teamName
    Employee leader
    Employee substitute

    static hasMany = [employees:Employee]
    static mappedBy = [employees:"team"]
}

class Employee {

    String firstName
    String lastName

    Team team
    static hasMany = [teams:Team]
}



Re: Löschen bei einer 1 zu 1 Beziehung

cleo - 12.03.2008 09:23
hmmm aber das kann doch gar nich funktionieren oder?
Datenbanktechnisch würde er mir dann doch einene FK für team bei employee anlegen und das wäre ja eher suboptimal.
Oder bin ich jetzt total neben der spur.. hmmmmmm


Re: Löschen bei einer 1 zu 1 Beziehung

cleo - 12.03.2008 10:31
ja mit den relationen bin ich mir immer nich so sicher :P

Datenbanktechnisch schaut das ja so aus

Employee

Team

Team_Employee
FK_Team
FK_Employee

Das wäre dann zumindest für die Teammitglieder quasi eine Many-To-Many Beziehung während
Leader und Substitute eine 1:1 darstellt

Ich hab jetzt das belongsTo in Team reingeschrieben und dann die relation mit clear() aufgelöst.
Scheint wie gewünscht zu funktionieren.
Ob das nu so ast rein ist.. bin ich mir nich sicher :P


Re: Löschen bei einer 1 zu 1 Beziehung

cleo - 12.03.2008 12:39
nu is doch wieder ein weiteres Problem aufgetaucht.. Die klassen sehen immo wie folgt aus:

class Employee {
	
	String firstName
	String lastName
        static hasMany = [teams:Team]

       static mapping = {...}

      static constraints = {...}

class Team {
	String teamName
	Employee leader
	Employee substitute
	String description
	
	static belongsTo = Employee
	static hasMany = [employees:Employee]

       static mapping = {...}
       static constraints = {...}

Ich möchte nun das Team löschen und das sieht bei mir immo so aus

   def delete = {

        def team = Team.get( params.id )

        if(team) {
		team.employees.each(){		
			def benutzer = Employee.get(it.id)
			benutzer.removeFromTeams(team)
                        //team.removeFromEmployees(benutzer)  <- hat beides den gleichen effekt
	  	}
		team.delete()

Ansich gesehen macht er es auch so wie ich es möchte ABER nur dann, wenn das Team nur einen Employee hat. Sind mehrere Employees zugeordnet
schmeisst er das:

Message: 
Caused by: java.util.ConcurrentModificationException 
Class: TeamController 
At Line: [23] 
Code Snippet:

23: team.employees.each(){ 
24: def benutzer = Employee.get(it.id)

ne Idee, warum er diese Exception wirft? Was sie bedeutet weiss ich aber warum das so ist und wie es umgangen werden kann weiss ich nich.


Re: Löschen bei einer 1 zu 1 Beziehung

cleo - 12.03.2008 12:54
Hallo Tatti,

also das löschen geht ja jetzt zum teil.. immo hab ich ja jetzt probs wenn ich 1 team löschen möchte welches 2 employees (oder mehr) besitzt


Re: Löschen bei einer 1 zu 1 Beziehung

panther - 12.03.2008 13:43
Bist du sicher, dass bei team.delete() nicht automatisch die Beziehung zu den Employees aufgehoben wird, so dass du es also nicht per Hand vor dem löschen des teams machen musst?


Re: Löschen bei einer 1 zu 1 Beziehung

cleo - 12.03.2008 15:10
jap bin ich mir sicher


Stelle deine Groovy-Frage jetzt!


Diese Seite zeigt den Thread "Löschen bei einer 1 zu 1 Beziehung" 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.