目前我遇到了一些麻烦,在Grails中创建了单向关系。
我有一个带属性地址的厕所。 这个地址是一个单独的类。 如果与地址相关联的Toilet-Object被删除,则理论上地址仍然存在。 如果地址被删除,厕所也会停留。
GORM的hasOne不是我需要的,因为它创建了双向关系。
定义类型类的属性只会导致非持久化地址(尽管它拥有自己的表) - 这意味着,地址与厕所对象的关联不存在
我对这些关系并不熟悉,所以我真的很感激解决方案或其他方式来实现我的目标
希望我的问题很清楚 - 如果没有评论,我会尝试添加进一步的解释
答案 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)
如果上厕所的地址是没有hasOne
或belongsTo
映射的简单关联,则不会对任何操作进行级联。
这意味着您必须保存地址,分配地址toilet.address
并保存厕所。
答案 2 :(得分:0)
找到了解决方案。
我遗漏的是在Toilet类中实现接口。
问题是(作为提醒),厕所类中的地址关系未保存到数据库中。
这是界面本身的问题 - 在这个界面中,getter和setter被定义并且必须被实现(界面的工作方式 - 显然)。这里的问题是,Address-Attribute的setter期望Type IAddress
。
我重载了setter,也接收了Address
类型的参数。
通过此更改,Toilet
和Address
之间的关系将正确保存到数据库中 - 地址的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 -> ... }
}