0

Я использую Grails 2.4.2 и имею класс Договор который имеет много InvoiceRecipient's. Класс InvoiceRecipients имеет атрибут invoiceType, который имеет 2 возможных значения, 'O' для счета-фактуры и 'C' для счета-фактуры. Как вы могли себе представить, только одна запись с типом 'O' разрешена для InvoiceRecipients для одного контракта.Проверка Grails над собственным доменом

Если я попытаюсь реализовать его, как в следующем snipplet, VM запускается в StackOverflow.

Другим подходом, который я пробовал, был метод службы, который выполняет итерацию через массив получателей контракта, чтобы подсчитывать записи с invoiceType 'O', или я попытался сделать подсчет числа с помощью InvoiceRecipient.countByContractAndInvoiceType(), чтобы определить число ' O в контракте -> отношение invoiceRecipients в контроллере.

В обоих последних случаях Hibernate генерирует инструкцию обновления для моей текущей записи InvoiceRecipient, которую я пытаюсь проверить. И даже если проверка текущего InvoiceRecipient завершается с ошибкой, и я заполняю объект-ошибку экземпляра экземпляра, запись уже обновлена ​​(без проблем, потому что ограничение не кодируется в класс и не вызывает ошибки в «save».) И У меня есть логически неправильные записи в базе данных.

class Contract implements Serializable { 
    ... 
    static hasMany = [recipients: InvoiceRecipient] 
    ... 
} 

class InvoiceRecipient implements Serializable { 
    static belongsTo = [contract: Contract] 
    ... 
    String invoiceType 
    ... 

    static constraints = { 
     invoiceType nullable: false, maxLength: 1, inList: ['O', 'C'], validator: { val, obj -> 
     /* => This generates a StackOverflow 
     if (InvoiceRecipient.countByContractAndInvoiceType(obj.contract, 'O') > 1) 
      return "invoiceRecipient.original.max.exceed" 
     */ 
    } 
} 

ответ

1

я бы, вероятно, использовать что-то вроде этого:

validator: { val, obj -> 
if (obj.recipients.findAll{invoiceType == 'O'}.size() > 1) 
     return "invoiceRecipient.original.max.exceed" 

Таким образом, вы должны быть в состоянии предотвратить Hibernate от попыток очистить грязные объекты и в процессе перепроверить этот объект.

+0

А, это здорово, работает как шарм! Я слишком редко использую find-Methods ... Единственное, что мне пришлось изменить, это ** это. ** invoiceType == 'O'. – susi