Вы бы не позволили бы GORM управлять свойством zip
(и запретить GORM делать это на втором этапе).
Это то, что подход mfloryan тоже говорит; однако, его подход не разделяет интересы, а правильно ( разделение интересов парадигма): в паттерне MVC (Model-View-Controller) задача контроллеров не состоит в том, чтобы " модель »модель данных, но это задача уровня доступа к данным (который - в случае GORM - сами классы домена).
Таким образом, класс User
будет реализован так:
class User {
String userName
String firstName
String lastName
String zip
ZipCode retrieveZipCode() {
ZipCode.findByZip(zip)
}
static constraints = {
zip nullable: false, blank: false, matches: /^\d{5}/,
/* not tested at my machine: */
validator: {
if(!retrieveZipCode(it)) {
return false
}
}
}
}
Обратите внимание на метод retrieveZipCode()
. Он не называется getZipCode()
, так как в противном случае Hibernate выдает исключение о «отсутствующем методе установки». Вы также можете поэкспериментировать с добавлением свойства zipCode
, метода getZipCode()
(который ничего не делает или, наоборот, выдает исключение) и добавлением свойства zipCode
к определению transinients
. - Все это (в любой комбинации) будет не работать.
Также обратите внимание на определение constraints
: оно совпадает, когда zip
состоит ровно из пяти цифр. (Я полагаю, что это формат почтовых индексов в США.)
Следует также убедиться, что база данных содержит запись для почтового индекса пользователя (синтаксис не проверен).
Я немного изменил класс ZipCode
(частично, чтобы избежать ошибки компиляции):
class ZipCode {
String zip;
String city;
String state;
Float latitude;
Float longitude;
}
И, наконец, интеграция тест:
class UserTests extends GroovyTestCase {
def testUserCreation() {
User user = new User(
userName: "foo", firstName: "bar",
lastName: "baz", zip: "12345")
assert user.validate()
assert user.retrieveZipCode()
user.save()
}
}
Спасибо