如何重写addTo*和RemoveFrom*GORM/Grails方法?

如何重写addTo*和RemoveFrom*GORM/Grails方法?,grails,gorm,Grails,Gorm,我试图重写Grails/GORM提供的动态方法addTo*,但它似乎不起作用 代码如下: class Match { static hasMany = [players: Player, matchPlayers: MatchPlayer] void addToPlayers(Player player) { if (players.add(player)) { MatchPlayer matchPlayer = new MatchPla

我试图重写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方法)?(每次在match实例中添加/删除玩家时,我只需要创建/删除一个对象MatchPlayer)。如果是,为什么我有例外?你有更好的设计吗


谢谢。

您的代码类似于标准的Grails方法,请参阅org.codehaus.groovy.Grails.pluginDomainClassGrailsPlugin.addRelationshipManagementMethods()中的代码。如果未指定集合类型,则初始集合实现为哈希集;如果指定SortedSet,则初始集合实现为TreeSet,例如

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

谢谢。关于我的第二个问题,您是否认为建议重写addTo*/removeFrom*方法?您还有其他方法吗?当然,这允许您使用标准的Grails方法,但需要自定义行为。另一种选择是将所有内容都转移到服务方法中,但这是一种偏好。