关于实现域类关系的问题& Grails中的约束

时间:2010-07-15 02:34:44

标签: grails dns constraints orm

使用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的字符串值。所以这导致了问题......

  1. personToPerson和personToStore应该合并到一个关系类型列表中吗?或者他们应该如图所示保持独立名单?
  2. 允许用户向关系约束添加新值的机制是什么?

2 个答案:

答案 0 :(得分:3)

1)域模型

保持代码简单。不要创建通用数据模型。这是地狱的方式。当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   

关系域可以访问所有关系域,抛出一个域。

2)约束

只需将 inList 切换为验证器即可。比你可以存储约束文件或数据库。 请参阅documentationfile 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