如何覆盖addTo *和RemoveFrom * GORM / Grails方法?

时间:2009-09-22 18:38:00

标签: grails gorm

我试图覆盖Grails / GORM提供的动态方法addTo *但它似乎不起作用。

以下是代码:

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)

问题是,当调用addToPlayers时,我得到以下异常:

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

所以基本上我似乎必须自己初始化集合'玩家'。

那么,在此之前,我想对GORM机制有一些见解:

1 - GORM中集合的默认实现是什么(我知道它是java.util.Set的实现,但是哪一个?)

2 - 这是正确的做法(通过覆盖addToPlayers方法)? (我唯一需要的是每次在匹配实例中添加/删除播放器时创建/删除对象MatchPlayer)。如果是,为什么我有例外?你有更好的设计吗?

谢谢。

1 个答案:

答案 0 :(得分:3)

您的代码与标准Grails方法类似,请参阅org.codehaus.groovy.grails.pluginsDomainClassGrailsPlugin.addRelationshipManagementMethods()中的代码。如果不指定集合的​​类型,则初始Set实现是HashSet,如果指定SortedSet,则为TreeSet,例如。

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