2009-09-22 5 views
4

J'ai essayé de remplacer la méthode dynamique addTo * fournie par Grails/GORM mais cela ne semble pas fonctionner.Comment remplacer les méthodes addTo * et RemoveFrom * GORM/Grails?

Voici le code:

class Match { 
    static hasMany = [players: Player, matchPlayers: MatchPlayer] 

    void addToPlayers(Player player) { 
     if (players.add(player)) { 
      MatchPlayer matchPlayer = new MatchPlayer(match: this, player: player) 
      matchPlayers.add(matchPlayer) 
     } 
    } 
} 
ma = new Match().save() 
ma.addToPlayers(player1) 

Le problème est que lorsque vous appelez addToPlayers je suis arrivé à l'exception suivante:

java.lang.NullPointerException: Cannot invoke method add() on null object 

Donc, fondamentalement, il semble que je dois me initialiser la collection « joueurs '.

Eh bien, avant de faire cela, je voudrais avoir quelques idées sur le mécanisme GORM:

1 - Quelle est l'implémentation par défaut pour les collections dans Gorm (je sais que c'est une implémentation de java.util.Set mais lequel?)

2 - Est-ce la bonne chose à faire (en surchargeant la méthode addToPlayers)? (Mon seul besoin est de créer/supprimer un objet MatchPlayer chaque fois qu'un joueur est ajouté/supprimé dans l'instance de match). Si oui, pourquoi ai-je une exception? Avez-vous un meilleur design pour cela?

Merci.

Répondre

3

Votre code est similaire à l'approche Grails standard, voir le code pour cela dans org.codehaus.groovy.grails.pluginsDomainClassGrailsPlugin.addRelationshipManagementMethods(). L'implémentation initiale de Set est soit un HashSet si vous ne spécifiez pas le type de la collection, soit un TreeSet si vous spécifiez un SortedSet, par ex.

static hasMany = [players: Player, matchPlayers: MatchPlayer] 
SortedSet players 
+0

Thx. En ce qui concerne ma deuxième question, pensez-vous qu'il est recommandé de surcharger les méthodes addTo */removeFrom *? Avez-vous une autre approche? – fabien7474

+0

Bien sûr, cela vous permet d'utiliser l'approche Grails standard, mais avec un comportement personnalisé. Une alternative serait de tout déplacer dans une méthode de service, mais c'est une chose de préférence. –