【问题标题】:How to override addTo* and RemoveFrom* GORM/Grails methods?如何覆盖 addTo* 和 RemoveFrom* GORM/Grails 方法?
【发布时间】:2009-09-22 18:38:00
【问题描述】:

我试图覆盖 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)。如果是,为什么我有一个例外?您对此有更好的设计吗?

谢谢。

【问题讨论】:

    标签: grails grails-orm


    【解决方案1】:

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

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

    【讨论】:

    • 谢谢。关于我的第二个问题,您认为建议覆盖 addTo*/removeFrom* 方法吗?你有其他方法吗?
    • 当然,这允许您使用标准 Grails 方法,但具有自定义行为。另一种方法是将所有内容都移到服务方法中,但这是一种偏好。
    猜你喜欢
    • 2012-09-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多