2016-06-30 7 views
1

Grails 3 Anwendung - Ich hatte Probleme mit einer hasMany -Eigenschaft in Grails nicht bevölkern. Ich habe gerade festgestellt, dass die besitzende Klasse in einem anderen Paket ist als die eigene Klasse. Mache ich etwas albernes, indem ich über Paketgrenzen hinweg erzähle?Erlaubt Grails/GORM Beziehungen in separaten Java-Paketen?

Grund Beispiel dafür, was ich tue und das Beobachten, falls das keinen Sinn macht:

Owning Domain-Klasse:

package com.example.project 

import com.example.project.configuration.ConfigFile 

class MotherClass { 
    String name 
    static hasMany = [ configFiles: ConfigFile ] 
} 

Owned Domain-Klasse:

package com.example.project.configuration 

import com.example.project.* 

class ConfigFile { 
    String name 
    MotherClass motherClass 
} 

In Bootstrap.groovy:

MotherClass motherClass = new MotherClass(name:"mother").save(failOnError: true) 
new ConfigFile(name: "file1", motherClass: mother).save(failOnError: true) 
new ConfigFile(name: "file1", motherClass: mother).save(failOnError: true) 
assert motherClass.configFiles.size() > 0 #this assertion would fail 

In einem zufälligen Service:

assert MotherClass.findByName("mother").configFiles.size() > 0 #this would fail too. 

versagt Meine Behauptung kann ich erlebe durch ein anderes Problem verursacht werden, aber ich wollte, war, dass die Überquerung Paketgrenzen überprüfen, nicht verantwortlich zu machen.

+0

Ich refaktoriert das Kind in das gleiche Paket und das Problem bleibt bestehen. Also ich vermute, die Paketgrenze ist nicht das eigentliche Problem. Ich werde mehr Details hinzufügen, sobald ich die Antwort herausgefunden habe. –

Antwort

2

Wenn Sie bei der obigen Eingabe keinen Fehler gemacht haben, definieren Sie ein 'motherClass'-Objekt, aber in ConfigFiles setzen Sie die motherClass auf ein' mother'-Objekt.

Ich nehme an, dass das nicht der Fall ist - dann denke ich, dass Sie Grails nicht genügend Informationen über die Besitzer-Kind-Beziehung liefern.

In der Regel würden Sie die untergeordneten Elemente zur Eigentümerklasse hinzufügen und die Besitzerklasse speichern und die Speicherkaskade für untergeordnete Elemente freigeben.

MotherClass mother = new MotherClass(name:"mother") 
mother.addToConfigFiles(new ConfigFile(name: "file1", motherClass: mother)) 
mother.addToConfigFiles(new ConfigFile(name: "file1", motherClass: mother)) 
mother.save(failOnError: true) 

Und im Idealfall sollten Sie belongsTo Klausel auf der ConfigFile Seite haben - sonst werden die Löschungen werden nicht kaskadiert werden. siehe: http://docs.grails.org/3.1.1/ref/Domain%20Classes/belongsTo.html

+0

In der Tat. Ich habe getappt. :/Danke, dass du das eingefangen hast. :) –

+0

Das scheint etwas offensichtlich, aber danke, dass Sie darauf hingewiesen haben. Ich dachte, dass das Speichern einer Konfigurationsdatei mit einem Verweis auf Mutter GORM dazu veranlassen würde, diese Konfigurationsdatei der Sammlung der Mutter hinzuzufügen. Was müsste passieren, damit GORM im Wesentlichen eine neue Abfrage ausführt, um die configFiles der Mutter zu finden, ohne dass ich dafür explizit codieren muss? (Wie ich es verstehe, fragt es nicht die Datenbank, um zu sehen, welche configFiles der Mutter gehören, weshalb die addToConfigFiles notwendig ist.) –

+0

Funktioniert gut. Vielen Dank! –

1

Der Fehler der Assertion in BootStrap.groovy ist sinnvoll, da GORM zugeordnete hasMany setzt, wenn eine Entität in die Hibernate-Sitzung geladen wird. In diesem Beispiel durchsucht GORM die Sitzung jedoch nicht automatisch und fügt eine neu persistente Entität den hasMany Gruppen seiner besitzenden Entität hinzu.

Versuchen Sie die Behauptung von der anderen Seite.

assert ConfigFile.findAllByMotherClass(motherClass) 

Ich weiß, dass das Ihr Problem nicht löst, aber hoffentlich zeigt es Ihnen die richtige Richtung.

+0

Die Behauptung von der anderen Seite funktioniert. Ich wäre damit als Workaround zufrieden, aber es gibt Stellen im Code, an denen das Rückwärtsgehen peinlich ist. –