Grails 圣杯只有一个单向的

Grails 圣杯只有一个单向的,grails,gorm,relationship,Grails,Gorm,Relationship,目前我遇到了一些麻烦,在Grails中创建单向关系 我有一个带有属性地址的类。 这个地址是一个单独的类。 从理论上讲,如果地址所关联的马桶对象被删除,该地址可能仍然存在。 如果地址被删除,厕所也将保留 GORM的hasOne不是我需要的,因为它创建了一种双向关系 定义类型类的属性只会导致非持久化地址(尽管它有自己的表)——这意味着地址与厕所对象的关联不存在 我不太熟悉这种关系,所以我非常希望能找到一个解决方案或其他方式来实现我的目标 希望我的问题是清楚的-如果没有评论,我将尝试添加进一步的解释如

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

我有一个带有属性地址的类。 这个地址是一个单独的类。 从理论上讲,如果地址所关联的马桶对象被删除,该地址可能仍然存在。 如果地址被删除,厕所也将保留

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

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

我不太熟悉这种关系,所以我非常希望能找到一个解决方案或其他方式来实现我的目标


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

如果厕所上的地址是一个简单的关联,没有一个
hasOne
属于映射
,那么就不会级联任何操作

这意味着您必须保存地址,分配给它
厕所。地址
,然后保存厕所。

取自

5.3.3了解级联更新和删除

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

如果不定义belongsTo,则不会发生级联,您必须手动保存每个对象

因此……如果不使用belongs,则如果手动保存每个对象,则不会出现问题。

找到了解决方案

我遗漏的是厕所类中接口的实现

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

这是接口本身的问题——在这个接口中,定义了getter和setter,并且必须实现它们(显然是接口的工作方式)。这里的问题是,Address属性的setter需要类型
IAddress

我重载setter以接收类型为
Address
的参数

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

我认为setter的定义只是一个错误(我对接口没有影响),但是有了这个解决方法,我无论如何都可以让它工作


希望这个解释对其他人也有帮助。

为什么不建立一个关联模型的类呢

class ToiletAddress {
  Toilet toilet
  Address address
  ...
}
。。。然后简单地将您的逻辑包装到一个服务中,在该服务中,您为厕所分配地址,并删除厕所或地址

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


如果地址被删除了怎么办?厕所会保留还是删除?它会保留。这是一种松散的关系(我不知道这是否能解释当时的情况)。谢谢你的建议,但这并没有起作用——这种关系只是没有出现在数据库中。这是一个学生项目,因此我们能够更改要求。
static constraints = {
  address unique: ['toilet']
  toilet validator: {val, obj -> ... }
}