Grails有一个单向的

时间:2012-04-16 21:38:36

标签: grails gorm relationship

目前我遇到了一些麻烦,在Grails中创建了单向关系。

我有一个带属性地址的厕所。 这个地址是一个单独的类。 如果与地址相关联的Toilet-Object被删除,则理论上地址仍然存在。 如果地址被删除,厕所也会停留。

GORM的hasOne不是我需要的,因为它创建了双向关系。

定义类型类的属性只会导致非持久化地址(尽管它拥有自己的表) - 这意味着,地址与厕所对象的关联不存在

我对这些关系并不熟悉,所以我真的很感激解决方案或其他方式来实现我的目标

希望我的问题很清楚 - 如果没有评论,我会尝试添加进一步的解释

4 个答案:

答案 0 :(得分:1)

取自

http://grails.org/doc/1.0.x/guide/5.%20Object%20Relational%20Mapping%20(GORM).html

5.3.3了解级联更新和删除

了解使用GORM时级联更新和删除的工作方式至关重要。要记住的关键部分是belongsTo设置,它控制哪个类“拥有”一个关系。 无论是一对一,一对多还是多对多,如果您定义belongsTo更新和删除将从拥有类级联到其所有(关系的另一侧)。

如果你没有定义belongsTo,那么就不会发生级联,你必须手动保存每个对象。

所以.....如果你不使用belongsTo,那么如果你手动保存每个对象,你应该没有问题。

答案 1 :(得分:0)

如果上厕所的地址是没有hasOnebelongsTo映射的简单关联,则不会对任何操作进行级联。

这意味着您必须保存地址,分配地址toilet.address并保存厕所。

答案 2 :(得分:0)

找到了解决方案。

我遗漏的是在Toilet类中实现接口。

问题是(作为提醒),厕所类中的地址关系未保存到数据库中。

这是界面本身的问题 - 在这个界面中,getter和setter被定义并且必须被实现(界面的工作方式 - 显然)。这里的问题是,Address-Attribute的setter期望Type IAddress

我重载了setter,也接收了Address类型的参数。

通过此更改,ToiletAddress之间的关系将正确保存到数据库中 - 地址的ID将保存在Toilet的表中。

我认为setter的定义只是一个错误(我对界面没有影响),但是通过这种解决方法我可以让它继续工作

希望这种解释能够帮助其他人。

答案 3 :(得分:0)

为什么没有一个为关联建模的类?

class ToiletAddress {
  Toilet toilet
  Address address
  ...
}

...然后简单地将您的逻辑包装到一个服务中,您可以在其中为厕所分配地址,并删除厕所或地址。

使用约束,您可以定义它是什么类型的关联。例如1-1,1-n(两侧)和n-m

static constraints = {
  address unique: ['toilet']
  toilet validator: {val, obj -> ... }
}