禁止Grails自动设置关系中的值

时间:2015-07-29 07:05:49

标签: grails gorm

在这种情况下,我有两个域,其相对位如下

    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

1 个答案:

答案 0 :(得分:1)

GORM完全按照设计的方式工作。

在您的情况下,SubcriptionBillingPeriod之间有一个联接表,其中包含2个域类实例的1条记录。这意味着,如果您创建一个类的实例并填充对另一个类的实例的引用,则会创建连接记录并使第二个类也可见。

这是您所看到的,也是您想要的行为。

如果你不想那样,你必须解开你的课程。一种可能的方法是使用hasOne和只读formula

Subcription {
  BillingPeriod getBillingPeriod(){
    BillingPeriod.findBySubscription this
  }
}

BillingPeriod {            
  static hasOne = [ subcription:Subcription ]
}

hasOne没有创建连接表,它使用的是FK列。