使用ArgoUML,我很快就创建了一些Domain类(Person,Store,Product)及其关系的简单表示。 UML Model http://img411.imageshack.us/img411/715/soquestion.png
我正在努力实现这种关系。下面是我对Person域的初始方法,但似乎我遗漏了一些重要的东西。
class PersonToPerson {
Person from
Person to
String relation
static constraints = {
relation(inList:["Friend to", "Enemy of", "Likes", "Hates"])
}
static belongsTo = [ Person ]
}
class Person {
String firstName
String secondName
.
.
.
static hasMany= [ personToPerson:PersonToPerson,
personToStore:PersonToStore ]
}
编辑:为了清晰起见更新了问题
在思考问题之后,我想我有更好的方式来提问。在上面的PersonToPerson的实现中,我将关系作为一个简单的字符串。我希望用户能够从约束中定义的唯一关系列表中选择PersonToPerson的字符串值。所以这导致了问题......
答案 0 :(得分:3)
保持代码简单。不要创建通用数据模型。这是地狱的方式。当personToPerson和personToStore保持分离时,遵循代码要容易得多。
实际上,建议的解决方案可以同时将关系作为合并和独立列表进行访问。
对于这个问题,我会使用inheritance feature in 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 ]
}
人员,产品和商店的数据库架构是常见的。但对于Relational域,看起来像这样:
<强>关系强>
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
关系域可以访问所有关系域,抛出一个域。
只需将 inList 切换为验证器即可。比你可以存储约束文件或数据库。 请参阅documentation或file example。
如何在DB中存储约束值的示例。首先创建一个域对象。
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 ]
}
答案 1 :(得分:0)
看起来很好。您可能需要考虑PersonToPerson类中的belongsTo。
此外,你有很多人应该是:[personToPersons:PersonToPerson ....&lt; - 删除s