Как переопределить методы addTo * и RemoveFrom * GORM / Grails? - PullRequest
4 голосов
/ 22 сентября 2009

Я попытался переопределить динамический метод addTo *, предоставляемый Grails / GORM, но, похоже, он не работает.

Вот код:

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

Так что, в принципе, мне кажется, что мне нужно инициализировать коллекцию 'Players'.

Что ж, прежде чем сделать это, я хотел бы получить представление о механизме GORM:

1 - Какая реализация по умолчанию для коллекций в GORM (я знаю, что это реализация java.util.Set, но какая?)

2 - Правильно ли это делать (переопределяя метод addToPlayers)? (Моя единственная потребность - создавать / удалять объект MatchPlayer каждый раз, когда игрок добавляется / удаляется в экземпляре матча). Если да, почему у меня есть исключение? У вас есть лучший дизайн для этого?

Спасибо.

1 Ответ

3 голосов
/ 22 сентября 2009

Ваш код аналогичен стандартному подходу Grails, см. Код этого в org.codehaus.groovy.grails.pluginsDomainClassGrailsPlugin.addRelationshipManagementMethods (). Начальная реализация Set - это либо HashSet, если вы не указали тип коллекции, либо TreeSet, если вы указали SortedSet, например,

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