禁止 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 完全按照设计的方式工作。

在你的例子中,SubcriptionBillingPeriod 之间有一个连接 -table,它为你的域 classes 的 2 个实例保存 1 条记录。这意味着,如果您创建一个 class 的实例并填充对另一个 class 实例的引用,则连接记录将被创建并对第二个 class 可见,如下所示出色地。

这就是您所看到的,也是您希望的行为。

如果你不想那样做,你必须解耦你的 classes。一种可能的方法是使用 hasOne 和只读 formula:

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

BillingPeriod {            
  static hasOne = [ subcription:Subcription ]
}

hasOne 不创建联接 table,它使用 FK 列。