2010-04-27 6 views
0

J'essaie de créer des objets de domaine à partir de xml.Grails: liaison de données

class A { 
    String name 
} 
class B { 
    A a 
    int something 
} 

J'ai d'abord créé une instance de A, et vidée. lors de la création de B, commencez par mapper les attributs disponibles.

def b = new B(xml.attributes()) 

ce serait la carte « quelque chose » correctement, mais pas le type d'objet A. Donc, je récupérer l'instance de A et ajouter comme

b.a = A.findByA("id of a") 

Je pouvais voir l'objet b est construit (à la fois champs remplis) dans le débogueur, mais il ne persiste pas sur save (flush: true).

  1. Quel est le problème dans le assignemt ci-dessus, ou doit utiliser l'ID au lieu (b.a.id = ..)
  2. Comment puis-je voir ce qui va mal dans le fichier journal? quelle trace doit être activée. J'ENABLED là dans le fichier de configuration

trace 'org.hibernate.SQL', 'org.hibernate.type' (qui donne la trace SQL pour insérer, sélectionnez etc. Mais pas pour le scénario ci-dessus, peut-être parce qu'il ne parvient pas mise en veille prolongée).

Tout pointeur, très apprécié .. merci.

Répondre

1

Je parierais que votre sauvegarde() échoue à la validation. Vous pouvez ajouter sauver (failonerror: true) pour lancer une exception lorsque la validation échoue, ou ajoutez le code suivant pour imprimer chacune des erreurs:

b.errors.allErrors.each { 
    println it 
} 
+0

+1 pour votre suggestion. failOnError affiche une erreur de validation. IllegalStateException: Impossible de convertir la valeur de type [java.lang.String] en type requis [com.bsr.test.A] pour la propriété 'A': aucun éditeur correspondant ou stratégie de conversion trouvée] Je ne comprends pas pourquoi traiter l'objet comme une chaîne, comme je l'ai expliqué, dans mon IDE, l'objet est rempli correctement après l'affectation. Je regarde BindData ou une autre méthode pour ajouter ce champ complexe. – bsr

+0

Sans voir plus de code de votre application, je ne peux pas aider à diagnostiquer ce problème supplémentaire. Il semble qu'au moment de la validation que la variable est une chaîne, lorsque l'objet est attendu. –

0

Pour créer une association, vous devez passer un objet de A

new B(a:A.get(id)) 

ou

B b = new B() 
b.a = A.get(id) 

Où id doit être un entier ou long

Soit Le contexte me manque, mais la classe A n'a pas de méthode findByA. Il n'y a pas un tel attribut A pour la classe A. Vous suggérer d'utiliser la méthode get pour des résultats stricts.

+0

merci .. vous avez raison, l'interface a été utilisée à tort dans mon exemple. le problème de récolte était, dans mon xml (voir je crée l'objet analysant le xml, donc je n'ai pas l'id) et j'utilise quelque chose comme .. Ici le problème est quand je fais def b = new B (xml.attributes()), le constructeur essaie de mapper A (qui devrait avoir leva la tête, car je ne connais toujours pas l'identifiant) – bsr