Домен, использующий addTo для карты, вызывающий ошибку - PullRequest
1 голос
/ 29 ноября 2011

В моей команде ровно 4 игрока. Позиция каждого игрока важна, поэтому я подумал, что я неплохо использую карту для своих игроков с клавишами: pos1, pos2, pos3, pos4

class Team {

Map players = [pos1:null, pos2:null, pos3:null, pos4:null]
static hasMany = [players:Player]

League league

static belongsTo = [club:Club]

static constraints = {
    league nullable:true
    players nullable:true

}
}

и мой игрок:

class Player{

static belongsTo = [club:Club, team:Team]

String firstname
String lastname

Team team



static constraints = {
    team nullable:true
    firstname nullable:true
    lastname nullable:true

}

public String fullname() {
    return firstname + " " + lastname + " - " + team?.id ?: "R"
}
}

Я использую метод addToPlayers() для автоматического обновления проигрывателя, но я получаю сообщение об ошибке при попытке выполнить следующее:

def player = new Player(firstname:"Peter", lastname:"Pan")
def team = new Team()
team.addToPlayers([pos1:player])

Stacktrace говорит:

Groovy.lang.MissingMethodException: No signature of method:
org.hibernate.collection.PersistentMap.add() is applicable for argument types:
(at.panda.Player) values: [at.panda.Player : null]
Possible solutions: any(), any(groovy.lang.Closure), any(groovy.lang.Closure), wait(),
wait(long), get(java.lang.Object)

at at.panda.PlayerController$_closure4.doCall(PlayerController.groovy:39)

at at.panda.PlayerController$_closure4.doCall(PlayerController.groovy)

at java.lang.Thread.run(Thread.java:662)

Это стоило мне много времени, и я надеюсь, что кто-то может мне помочь. Мне не нужно придерживаться «Карты», если у вас есть лучшее решение.

Ответы [ 2 ]

3 голосов
/ 29 ноября 2011

Если у вас есть свойство Map в доменном объекте, ключом и значением должны быть строки: Руководство по Grails: реляционное сопоставление объектов .

Но почему вы используете карту для своих игроков? Если у вас ровно четыре игрока, просто определите свою команду как:

class Team {
    Player pos1
    Player pos2
    Player pos3
    Player pos4
    ...
}
0 голосов
/ 29 ноября 2011

Лично я бы смоделировал ваш домен следующим образом:

class Team {

  //Map players = [pos1:null, pos2:null, pos3:null, pos4:null]
  static hasMany = [players:Player]

  // The reference to league is now specified below in belongsTo       
  //League league

  static belongsTo = [club:Club,league:League]

  static constraints = {
    league nullable:true

    // must have 4 players
    players(size: 4..4)
  }
}

class Player{

  // Remove the reference to club as this can be retrieved through the Team
  static belongsTo = [/*club:Club,*/ team:Team]

  String firstname
  String lastname
  Integer position

  // Remove this duplicate reference to team
  //Team team        

  static constraints = {
    team nullable:true
    firstname nullable:true
    lastname nullable:true 

    // This should ensure that you can't create 2 players with the same position
    // in the same team
    position(unique:'team')   
  }
}

Эта модель облегчит упорядочение всех игроков по позициям, и если вы решите, что хотите изменить количество игроков,все, что вам нужно сделать, это изменить ограничение players(size: 4..4)

Я бы рассмотрел добавление метода addPlayer(Player player) в Team, который позаботится о правильной настройке свойства позиции.

Если нетпротестировал любой из приведенных выше кодов, поэтому обращайтесь с ним осторожно.

...