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) 在更改数据存储时不会出现问题。如果您可以确保只有您的域用于访问数据,并且有人不直接从数据存储、外部系统/进程访问数据,那么这是一个很好的解决方案。是的,您有一个观点。我想我没有什么理由不能在迁移方法中使用它。