2

我在更新具有多对多关系的域时遇到问题。例如,考虑这两个简单的域。

class Student {
   String name
   static hasMany = [courses: Course]
}

class Course {
  String name
  static hasMany = [students: Student]
  static belongsTo = [Student]
}

为了更新学生的姓名和他/她的课程名称,我使用这样的数据绑定:

def params = [
  'courses[0].id': c2.id,
  'courses[0].name': 'c11',
  'courses[1].id': c1.id,
  'courses[1].name': 'c22'
]
s1.properties = params
s1.save(flush: true)

但是,这会导致错误:

org.springframework.beans.InvalidPropertyException: Invalid property 'courses[1]' of bean class [tb.Student]:
Invalid list index in property path 'courses[1]'; nested exception is java.lang.IndexOutOfBoundsException:
Index: 1, Size: 1

经过一番搜索,我发现所有答案都建议使用 List 而不是 Set。不过,我还是更喜欢使用 Set。

环境

  • 圣杯:2.2.3
  • 爪哇:1.6.0_45
  • 操作系统:Ubuntu 13.04
4

2 回答 2

1

My solution is to clear the children list before data binding. This is the full code to test above domains. The line s1.courses.clear() will prevent above error.

def s1 = new Student(name: 's1').save(flush: true)
def s2 = new Student(name: 's2').save(flush: true)
def c1 = new Course(name: 'c1').save(flush: true)
def c2 = new Course(name: 'c2').save(flush: true)
s1.addToCourses(c1)
s1.addToCourses(c2)
s1.save(flush: true)
def params = [
  'courses[0].id': c2.id,
  'courses[0].name': 'c11',
  'courses[1].id': c1.id,
  'courses[1].name': 'c22'
]
s1.courses.clear()
s1.properties = params
s1.save(flush: true)

However, I still think this problem is a bug. And my solution is a work around.

于 2013-07-08T02:45:55.043 回答
0

Set 没有排序,因此如果您指定索引,它将失败。

如果您不想使用 List,请尝试改用 SortedSet。

您可以找到更多信息@ ( http://grails.org/doc/latest/guide/single.html#ormdsl ) 6.5.3 默认排序顺序

于 2013-07-08T07:15:54.710 回答