| 

.NET C# Java Javascript Exception

GORM: Wenn Primärschlüssel gleichzeitig Fremdschlüssel sein soll

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.


GORM: Wenn Primärschlüssel gleichzeitig Fremdschlüssel sein soll

slyfox1972 - 08.04.2010 19:54
Hallo! Ich hab mal wieder ein kleines Problem...

Also ich hab eine 0..1 Beziehung:

Eine Klasse Foo und eine Klasse Bar.

Ein Foo kann ein Bar haben, muss aber nicht.
Jedes Bar gehört zu einem Foo.

Bei Bar soll der Primärschlüssel gleichzeitig der Fremdschlüssel zu Foo sein, und der soll auch "foo_id" heissen.

class Foo {
    String fooName

    static mapping = {
		columns {
			id column:'foo_id'
		}
	}
	
    static constraints = {
    }
}
class Bar {
    String barName

    static belongsTo = Foo

    static mapping = {
		columns {
			id column:'foo_id'
		}
	}

    static constraints = {
    }
}
Ein erster Test
def foo1 = new Foo(fooName:'Foo with no bar').save()
def foo2 = new Foo(fooName:'Foo with one bar').save()
def bar2 = new Bar(barName:'Bar',foo:foo2).save()

ergibt die Tabelle:

mysql> select * from foo;
+--------+---------+------------------+
| foo_id | version | foo_name         |
+--------+---------+------------------+
|      1 |       0 | Foo with no bar  |
|      2 |       0 | Foo with one bar |
+--------+---------+------------------+
2 rows in set (0.00 sec)

mysql> select * from bar;
+--------+---------+----------+
| foo_id | version | bar_name |
+--------+---------+----------+
|      1 |       0 | Bar      |
+--------+---------+----------+
1 row in set (0.00 sec)

mysql>

foo_id sollte bei Bar "2" sein.

In der Klasse Bar fehlt das wohl das Property Foo...

Füge ich in Bar.groovy die Zeile
Foo foo
hinzu, kommt's zu eine Exception weil Grails eine weitere Zeile "foo_id" zur Tabelle hinzufügen will.
Es soll aber der bereits vorhandene Schlüssel verwendet werden.

Wie kann ich es wie gewünscht umsetzen?

Viele Grüße

Egon Schmid


Re: GORM: Wenn Primärschlüssel gleichzeitig Fremdschlüssel sein soll

koeberle - 08.04.2010 21:47
Viel Spaß dabei. Aber ich kann dir jetzt schon verraten, das das holperig wird. Es scheint vollkommen das Konzept Primärschlüssel zu fehlen, vielleicht verstehe ich aber auch das SQL, das ich da gelesen habe nicht ganz richtig.
Aber wenn mich nicht alles täuscht verbietet dir nichts in dieser Tabelle zwei vollkommen identische Einträge zu erstellen, und damit wird Hibernate dann ein Problem haben. Was für ein Datenbank-Server verbirgt sich den dahinter?


Re: GORM: Wenn Primärschlüssel gleichzeitig Fremdschlüssel sein soll

milkyman - 09.04.2010 08:29
Ich hab mal für eine bestehende Datenbank einen solchen Fall gehabt. Da gab es eine Tabelle deren PrimaryKey sich aus 3 Fremdschlüsseln zusammengesetzt hat.

Hier mal die betreffende Domain. Vielleicht kannst du damit was anfangen.
class UserRight  {
	
	static belongsTo = [person:Person, project:Project, level:AccessLevel] 

	static mapping = {
			version false
			table 'person2accesslevel'
      		id composite:['person', 'project', 'level']
      		person column:'FK_PERSON_ID', lazy:true
      		project column:'FK_PROJECT_ID', lazy:true
      		level column:'FK_ACCESSLEVEL_ID', lazy:true

  	}
        ...
}

Weiterhin musste ich auch die setId/getId überschreiben, um die Sache für die generierten Views lauffähig zu bekommen. Ich denke der Code aus der UserRights erklärt das Konzept ganz gut. In den Templates verwende ich überall getComposite() statt get() zum Laden.

  	void setId(String compositeId) {
 		  person.id = new Long(getPersonFromId(compositeId))
 		  project.id = new Long(getProjectFromId(compositeId))
 		  level.id = new Long(getLevelFromId(compositeId))
	}
	
	String getId(){
  		return person.id + "-" + project.id + "-" + level.id;
  		//return person.id ;
	}
	
	static String getPersonFromId(String compositeId) {
		return compositeId.substring(0,compositeId.indexOf("-"));
	}
	static String getProjectFromId(String compositeId) {
		return compositeId.substring(compositeId.indexOf("-")+1,compositeId.lastIndexOf("-"));
	}
	static String getLevelFromId(String compositeId) {
		return compositeId.substring(compositeId.lastIndexOf("-")+1);
	}

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

Bye,
Horst


Stelle deine Groovy-Frage jetzt!


Diese Seite zeigt den Thread "GORM: Wenn Primärschlüssel gleichzeitig Fremdschlüssel sein soll" 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.