强制GORM将一对一关系视为独立关系

时间:2012-04-05 11:19:31

标签: hibernate grails groovy gorm

我有一个MyParameter类和一个MyParameterValue类定义如下:

class MyParameter {
  MyParameterValue defaultValue

  static belongsTo = [anotherObject: AnotherDomainClass]
}

class MyParameterValue {
  MyParameter valueOf
}

我的问题是 GORM坚持用后向引用来对待这种一对一关系,这不是我想要的。它对参数的更新方式有影响。

示例:

    def param = new MyParameter(defaultValue: new MyParameterValue()).save()
    def paramVal = new MyParameterValue (valueOf: param).save()
    assert param.defaultValue != paramVal

此代码抛出AssertionFailure。所以发生了什么事?虽然应该很清楚我并不打算在第二行修改param的默认值,但GORM会更新它,就好像defaultValue必须与valueOf中的MyParameterValue同步一样},

所以GORM实际上改变了我想要的东西:

UML Example of two references in opposite direction

进入那个:

UML Example of two-sided one-to-one relationship

以下是我的两个问题:

  • hasOne关键字的目的是什么,如果从类型的角度看,所有引用看起来像后引用,都会被视为一对一的关系?
  • 如何强制GORM不将valueOf视为defaultValue的背面参考?请注意,我不想更改级联行为:更改defaultValue的{​​{1}}应该级联。

更新

我仍然对上述问题的答案感兴趣。我使用的解决方案是为默认值提供自己的类MyParameter。你可以猜到,MyDefaultValue是一个复杂的结构,我正在寻找一种避免重复这种结构的方法。

1 个答案:

答案 0 :(得分:0)

如果您不想要任何反向引用,但想手动处理所有关系,我想我会定义我的对象:

class MyParameter {
  MyParameterValue defaultValue

  static constraints {
     defaultValue nullable: true
  }
}

class MyParameterValue {
  MyParameter valueOf

  static constraints {
     valueOf nullable: true
  }
}

但这要求你自己做所有的铅笔。