Поддержание обеих сторон самореферентной связи «многие ко многим» в объекте предметной области Grails

У меня возникли проблемы с работой отношений "многие ко многим" в Grails. Есть ли что-то явно неправильное в следующем:

class Person {
    static hasMany = [friends: Person]
    static mappedBy = [friends: 'friends']

    String name
    List friends = []

    String toString() {
        return this.name
    }
}

class BootStrap {
     def init = { servletContext ->
        Person bob = new Person(name: 'bob').save()
        Person jaq = new Person(name: 'jaq').save()
        jaq.friends << bob

        println "Bob's friends: ${bob.friends}"
        println "Jaq's friends: ${jaq.friends}"
     }
} 

Я ожидаю, что Боб будет дружить с Жаком и наоборот, но при запуске я получаю следующий вывод:

Running Grails application..
Bob's friends: []
Jaq's friends: [Bob]

(Я использую Grails 1.2.0)


person Armand    schedule 25.03.2010    source источник


Ответы (1)


Кажется, это работает:

class Person {
    static hasMany   = [ friends: Person ]
    static mappedBy  = [ friends: 'friends' ]
    String name

    String toString() {
        name
    }
}

а затем в BootStrap:

class BootStrap {
     def init = { servletContext ->
        Person bob = new Person(name: 'bob').save()
        Person jaq = new Person(name: 'jaq').save()

        jaq.addToFriends( bob )

        println "Bob's friends: ${bob.friends}"
        println "Jaq's friends: ${jaq.friends}"
     }
} 

Я получаю следующее:

Running Grails application..
Bob's friends: [jaq]
Jaq's friends: [bob]
person tim_yates    schedule 25.03.2010
comment
Отлично работает, спасибо :=) Существенная разница заключается в замене jaq.friends‹‹bob на jaq.addToFriends(bob). Я немного удивлен, что они не делают то же самое; было бы неплохо предотвратить добавление друзей только на одной стороне отношений. - person Armand; 25.03.2010
comment
Элисон - причина, по которой они не делают то же самое, заключается в том, что ‹‹ вызывает метод leftShift, который просто добавляет его в набор. addToFriends — это метод, добавленный в метакласс Person, который выполняет правильные базовые операции гибернации для сохранения и управления отношениями. - person th3morg; 21.03.2014