У меня есть приложение Grails с кучей доменных классов, некоторые из которых имеют много полей, некоторые из которых имеют отношение hasMany
к рассматриваемому доменному классу. Для этого конкретного приложения у меня есть только одно «ограничение», то есть каждый экземпляр каждого доменного класса должен быть уникальным. Меня не волнует, имеет ли произвольное поле одно и то же значение в нескольких экземплярах одного и того же доменного класса, если каждый экземпляр сделан уникальным значением какого-либо другого поля в этом доменном классе. Поэтому в основном я хочу, чтобы проверка происходила на уровне экземпляра класса домена, а не на уровне поля класса домена. Прямо сейчас я делаю это, используя очень классную аннотацию @EqualsAndHashCode
для генерации моих методов equals
и hashCode
, а затем вызывая equals
в пользовательском валидаторе для некоторого произвольного поля доменного класса.
Два вопроса:
- Есть ли более эффективный способ проверки уникальности класса предметной области?
- Если нет, то есть ли способ вызвать свой пользовательский код валидатора в самом экземпляре класса домена вместо того, чтобы проходить через одно из полей экземпляра класса домена?
@groovy.transform.EqualsAndHashCode class MyDomainClass { String some int arbitrary boolean field static constraints = { // The field I chose to validate on is irrelivant, I just need to run the validation code **somewhere** arbitrary validator: { val, obj -> return !MyDomainClass.getAll().contains(obj) } } }
Я также должен добавить, что ищу общий (надеюсь, эффективный) способ сделать это. Я понимаю, что вызов getAll()
очень неэффективен, и вместо этого вызов некоторого варианта find
или выполнение запроса HQL к точным полям каждого доменного класса было бы намного эффективнее... просто написание занимает намного больше времени!
Примеры
assert MyDomainClass.getAll().isEmpty() // true
def myDomainClass1 = new MyDomainClass( some: "foo", arbitrary: 1, field: true)
assert MyDomainClass.getAll().contains(myDomainClass1); // false
myDomainClass1.save(flush:true)
def myDomainClass2 = new MyDomainClass( some: "bar", arbitrary: 1, field: true)
assert MyDomainClass.getAll().contains(myDomainClass2); // false. Even though this has the same `arbitrary` value as myDomianClass1, it has a different `some` value which makes it unique.
myDomainClass2.save(flush:true)
def myDomainClass3 = new MyDomainClass( some: "foo", arbitrary: 1, field: false)
assert MyDomainClass.getAll().contains(myDomainClass3); // false. Even though this has the same `some` value as myDomainClass1 and the same `arbitrary` value as myDomainClass1 and myDomainClass2, it has a different `field` value which makes it unique.
myDomainClass3.save(flush:true)