禁止 Grails 在关系中自动设置值
Disable Grails from automatically setting values in relations
是这样的,我有两个域,其相对位如下
Subcription {
BillingPeriod billingPeriod
static constraints = {
billingPeriod nullable: true
}
}
BillingPeriod {
Subcription subcription
static constraints = {
subscription nullable: true
}
}
域中还有其他字段,但我省略了这些字段,因为此问题不需要它们。
我正在做的是获取订阅并使用该订阅创建新的 BillingPeriod。这是代码
Subscription subscription = Subscription.get(id)
BillingPeriod billingPeriod = new BillingPeriod(subscription: subscription)
billingPeriod.save()
现在的问题是,当在第 1 行检索订阅时,它的 billingPeriod 为空。但就在第 2 行执行或使用该订阅创建新的 BillingPeriod 实例之后,订阅的 billingPeriod 从 null 更改为新创建的 billingPeriod!
如何stop/disable自动构建这两种关系?
我正在使用 Grails 2.4.4
GORM 完全按照设计的方式工作。
在你的例子中,Subcription
和 BillingPeriod
之间有一个连接 -table,它为你的域 classes 的 2 个实例保存 1 条记录。这意味着,如果您创建一个 class 的实例并填充对另一个 class 实例的引用,则连接记录将被创建并对第二个 class 可见,如下所示出色地。
这就是您所看到的,也是您希望的行为。
如果你不想那样做,你必须解耦你的 classes。一种可能的方法是使用 hasOne
和只读 formula
:
Subcription {
BillingPeriod getBillingPeriod(){
BillingPeriod.findBySubscription this
}
}
BillingPeriod {
static hasOne = [ subcription:Subcription ]
}
hasOne
不创建联接 table,它使用 FK 列。
是这样的,我有两个域,其相对位如下
Subcription {
BillingPeriod billingPeriod
static constraints = {
billingPeriod nullable: true
}
}
BillingPeriod {
Subcription subcription
static constraints = {
subscription nullable: true
}
}
域中还有其他字段,但我省略了这些字段,因为此问题不需要它们。
我正在做的是获取订阅并使用该订阅创建新的 BillingPeriod。这是代码
Subscription subscription = Subscription.get(id)
BillingPeriod billingPeriod = new BillingPeriod(subscription: subscription)
billingPeriod.save()
现在的问题是,当在第 1 行检索订阅时,它的 billingPeriod 为空。但就在第 2 行执行或使用该订阅创建新的 BillingPeriod 实例之后,订阅的 billingPeriod 从 null 更改为新创建的 billingPeriod!
如何stop/disable自动构建这两种关系?
我正在使用 Grails 2.4.4
GORM 完全按照设计的方式工作。
在你的例子中,Subcription
和 BillingPeriod
之间有一个连接 -table,它为你的域 classes 的 2 个实例保存 1 条记录。这意味着,如果您创建一个 class 的实例并填充对另一个 class 实例的引用,则连接记录将被创建并对第二个 class 可见,如下所示出色地。
这就是您所看到的,也是您希望的行为。
如果你不想那样做,你必须解耦你的 classes。一种可能的方法是使用 hasOne
和只读 formula
:
Subcription {
BillingPeriod getBillingPeriod(){
BillingPeriod.findBySubscription this
}
}
BillingPeriod {
static hasOne = [ subcription:Subcription ]
}
hasOne
不创建联接 table,它使用 FK 列。