1) Доменная модель
Сохраняйте свой код простым. Не создавайте общую модель данных. Это путь в ад. Когда вы personToPerson и personToStore разделяете, гораздо проще следовать вашему коду.
Фактически предлагаемое решение позволяет получить доступ к отношениям как к консолидированному, так и к независимому списку одновременно.
Для этой проблемы я бы использовал функцию наследования в GORM .
Ваши занятия будут выглядеть так:
class Person {
String name
static hasMany = [personToPerson:PersonToPerson,
personToProduct:PersonToProduct,
personToStore:PersonToStore]
static mappedBy = [personToPerson:"from"]
}
class Product{
String productName
}
class Relationship{
String note
}
class Store{
String storeName
}
class PersonToPerson extends Relationship{
Person from
Person to
String relation
static constraints = {
relation(inList:["Friend to", "Enemy of", "Likes", "Hates"])
}
static belongsTo = [ from:Person ]
}
class PersonToProduct extends Relationship{
Person person
Product product
String relation
static constraints = {
relation(inList:["likes", "dislikes"])
}
static belongsTo = [ person:Person ]
}
class PersonToStore extends Relationship{
Person person
Store store
String relation
static constraints = {
relation(inList:["Stock person", "Owner", "Manager", "Patron"])
}
static belongsTo = [ person:Person ]
}
Схема БД для Person, Product и Store обычная. Но для реляционных доменов это выглядит так:
Отношения
Field Type Null Default
id bigint(20) No
version bigint(20) No
note varchar(255) No
class varchar(255) No
person_id bigint(20) Yes NULL
product_id bigint(20) Yes NULL
relation varchar(8) Yes NULL
from_id bigint(20) Yes NULL
to_id bigint(20) Yes NULL
store_id bigint(20) Yes NULL
Домен отношений позволяет получить доступ ко всем реляционным доменам через один домен.
2) Ограничение
Просто переключите inList на validator . Чем вы можете хранить ограничения в файле или БД.
См. документацию или пример файла .
Пример, как хранить значения ограничений в БД. Сначала создайте объект домена.
class Constrain{
String name
String type
}
Чем выглядит класс домена:
class PersonToPerson extends Relationship{
Person from
Person to
String relation
static constraints = {
relation(nullable:false, validator:{val, obj ->
def list = Constrain.findAllByType('person').collect{it.name}
return list.contains(val)
})
}
static belongsTo = [ from:Person ]
}