2009-09-22 67 views
4

我試圖覆蓋由Grails/GORM提供的動態方法addTo *,但它似乎不起作用。如何覆蓋addTo *和RemoveFrom * GORM/Grails方法?

下面是代碼:

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 

所以基本上看來,我必須對自己初始化集合「玩家」。

好了,在這之前,我想對格姆機制的一些見解:

1 - 什麼是在GORM集的默認實現(我知道這是java.util.Set中的實現但哪一個?)

2 - 這是正確的做法(通過重寫addToPlayers方法)? (我唯一需要的是每次在匹配實例中添加/刪除玩家時創建/刪除MatchPlayer對象)。如果是,爲什麼我有例外?你有更好的設計嗎?

謝謝。

回答

3

您的代碼與標準Grails方法類似,請參閱org.codehaus.groovy.grails.pluginsDomainClassGrailsPlugin.addRelationshipManagementMethods()中的代碼。如果不指定集合的​​類型,則初始Set實現爲HashSet,如果指定SortedSet則爲TreeSet。

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

Thx。關於我的第二個問題,你是否推薦重寫addTo */removeFrom *方法?你有另一種方法嗎? – fabien7474 2009-09-30 14:06:46

+0

當然,它允許您使用標準的Grails方法,但使用自定義行爲。另一種方法是將所有東西都轉換成服務方式,但這是一個偏好。 – 2009-10-04 05:55:49