在这种情况下,我有两个域,其相对位如下
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为null。但是在第2行被执行或者使用该订阅创建新的BillingPeriod实例之后,订阅的billingPeriod从null更改为新创建的billingPeriod!
如何停止/禁用这种双向关系自动构建?
我正在使用Grails 2.4.4
答案 0 :(得分:1)
GORM完全按照设计的方式工作。
在您的情况下,Subcription
和BillingPeriod
之间有一个联接表,其中包含2个域类实例的1条记录。这意味着,如果您创建一个类的实例并填充对另一个类的实例的引用,则会创建连接记录并使第二个类也可见。
这是您所看到的,也是您想要的行为。
如果你不想那样,你必须解开你的课程。一种可能的方法是使用hasOne
和只读formula
:
Subcription {
BillingPeriod getBillingPeriod(){
BillingPeriod.findBySubscription this
}
}
BillingPeriod {
static hasOne = [ subcription:Subcription ]
}
hasOne
没有创建连接表,它使用的是FK列。