Я использую 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"
*/
}
}
А, это здорово, работает как шарм! Я слишком редко использую find-Methods ... Единственное, что мне пришлось изменить, это ** это. ** invoiceType == 'O'. – susi