Grails-仅通过引用id进行关联

Grails-仅通过引用id进行关联,grails,domain-driven-design,Grails,Domain Driven Design,我试图在我的应用程序中采用域驱动设计,为了限制聚合根之间的深度遍历,建议只使用它们的标识将它们关联起来。假设我有以下域类 人 class Person { Integer age String name } 还有电话账单 class PhoneBill { // reference to Person Long accountHolderId BigDecimal amount } 实际上,此设置已经可以工作了。但是,我想将外键约束添加到accountHold

我试图在我的应用程序中采用域驱动设计,为了限制聚合根之间的深度遍历,建议只使用它们的标识将它们关联起来。假设我有以下域类

class Person {

  Integer age

  String name

}
还有电话账单

class PhoneBill {

  // reference to Person
  Long accountHolderId

  BigDecimal amount

}

实际上,此设置已经可以工作了。但是,我想将外键约束添加到
accountHolderId
中,以确保数据存储中已经存在设置为它的任何值。官方的Grails文档似乎没有涵盖这一点。

假设您的
Person
对象仍然有一个id,您可以添加一个id,如果
id
无效,则返回一个错误

class PhoneBill {

  // reference to Person
  Long accountHolderId

  BigDecimal amount

    static constraints = {
        accountHolderId validator: { 
            !Person.exists(it) ?: 'your.custom.error.message.key'
        }
    }
}

请注意,
.exists()
仅适用于Grails2.3.x,我相信。如果您使用的是旧版本,也可以调用
.get()

使用数据库迁移并从中管理外键约束。由于您没有使用GORM/Grails域类来建模您的关系,现在由您决定。这是我最初计划的,我只是不知道(实际上忘记了)数据库迁移。我认为,这样做的缺点是,更改数据存储有点困难,尤其是更改NoSQL类型。是吗?为什么要对关系数据使用NoSQL数据存储?这最好放在RDBMS中。我不确定数据库迁移插件是否适用于非RDBMS。使用NoSQL作为SQL数据库的替代品有很多原因,即使是对于这样的数据也是如此。公平地说,我的评论只是为了确保您已经检查了所有选项,并基于理性而不是炒作做出选择。我完全知道NoSQL数据库有很多好的使用案例,但是很多时候人们只是使用它们而没有真正的理由。(:这似乎是比迁移方法更好的选择:1)它看起来很容易测试(DDD中的断言);2) 约束在域类中表示;3) 在更改数据存储时不会出现问题。如果您可以确保只有您的域用于访问数据,并且有人不直接从数据存储、外部系统/进程访问数据,那么这是一个很好的解决方案。是的,您有一个观点。我想我没有什么理由不能在迁移方法中使用它。