4

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 を作成/削除することです)。はいの場合、なぜ例外があるのですか? このためのより良い設計はありますか?

ありがとうございました。

4

1 に答える 1

3

コードは標準の Grails アプローチに似ています。org.codehaus.groovy.grails.pluginsDomainClassGrailsPlugin.addRelationshipManagementMethods() のコードを参照してください。Set の初期実装は、コレクションのタイプを指定しない場合は HashSet であり、SortedSet を指定する場合は TreeSet です。

static hasMany = [players: Player, matchPlayers: MatchPlayer]
SortedSet players
于 2009-09-22T19:54:52.757 に答える