0

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

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

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

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

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

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

4

4 回答 4

1

摘自

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

5.3.3 了解级联更新和删除

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

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

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

于 2012-04-16T22:38:26.457 回答
0

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

class ToiletAddress {
  Toilet toilet
  Address address
  ...
}

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

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

static constraints = {
  address unique: ['toilet']
  toilet validator: {val, obj -> ... }
}
于 2014-10-07T18:20:36.427 回答
0

hasOne如果厕所上的地址是一个没有或映射的简单关联belongsTo,则不会有任何操作级联。

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

于 2012-04-16T21:57:29.557 回答
0

找到了解决方案。

我遗漏的是在厕所类中实现一个接口。

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

这是接口本身的问题——在这个接口中,getter 和 setter 被定义并且必须被实现(接口的工作方式——显然)。这里的问题是, Address-Attribute 的设置者需要 Type IAddress

我重载了 setter 以接收 type 的参数Address

Toilet通过这个改变,和之间的关系Address被正确地保存到数据库中——地址的ID被保存在厕所的表中。

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

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

于 2012-04-17T20:20:00.547 回答