Как я могу сделать так, чтобы grails принимал отношение «принадлежность», которое может быть нулевым? - PullRequest
1 голос
/ 03 ноября 2011

Я пытаюсь создать два домена, которые ссылаются друг на друга. Однако одно не обязательно имеет другое или принадлежит другому. Каждый объект из обоих доменов может ссылаться на 0 или 1 объект из другого домена.

У меня есть этот код, но он не работает:

class Domain1{

    //declare some vars
          ...

    static belongsTo = [domain2Object:Domain2]

    static constraints = {
    domain2Object(nullable:true)
    }
}

Использование hasOne с ограничением nullable: true работает, но не работает, если другая сторона имеет то же самое. Дело в том, что я хочу иметь возможность удалять любой объект из любого из доменов, который ссылается на объект из другого домена, не вызывая также удаление указанного объекта. Итак, как я сказал, ни один объект не принадлежит другому, они просто ссылаются друг на друга.

=============================================== ========================================== Ответ:

используя это в обоих классах домена:

class ClassB {
   static hasOne = [classA:ClassA]

   def beforeDelete = {
      classA?.delete()
   }
}

static constraints = {
    classA(nullable:true)
}

Я получаю эту ошибку, когда пытаюсь добавить объект любого из двух классов, оставляя другой класс пустым:

«Нарушение ограничения целостности - нет родительской таблицы FK24742AC1AA048190: PENDINGORDER»

1 Ответ

1 голос
/ 03 ноября 2011

Вы можете использовать событие hasOne onDelete.

class ClassB {
   static hasOne = [classA:ClassA]

   def beforeDelete = {
      classA?.delete()
   }
}

События и автоматическая отметка времени

Полагаю, исключение происходит из-за того, что вы пытаетесь удалить объект по его связи в событии beforeDelete.Удалите свое отношение, прежде чем удалить его следующим образом:

class ClassA {
  ClassB classB

  static constraints = {
      classB nullable: true
  }
}

class ClassB {
    ClassA classA

    static constraints = {
      classA nullable: true
    }

    def beforeDelete = {
      classA?.classB? = null
      classA?.delete(flush:true)
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...