【问题标题】:Grails hasOne unidirectionalGrails hasOne 单向
【发布时间】:2012-04-16 21:38:36
【问题描述】:

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

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

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

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

我对这类关系不是很熟悉,所以我非常感谢有解决方案或其他方式来实现我的目标

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

【问题讨论】:

  • 地址被删除了怎么办?马桶是留下还是删除?
  • 它会留下来。这是一种松散的关系(我不知道这是否能解释这种情况)。

标签: grails grails-orm relationship


【解决方案1】:

取自

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

5.3.3 了解级联更新和删除

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

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

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

【讨论】:

    【解决方案2】:

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

    这意味着你必须保存地址,分配它toilet.address,然后保存厕所。

    【讨论】:

    • 感谢您的建议,但这不起作用 - 关系只是没有出现在数据库中。这是一个学生项目,因此我们能够更改要求。
    【解决方案3】:

    找到了解决办法。

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

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

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

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

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

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

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

    【讨论】:

      【解决方案4】:

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

      class ToiletAddress {
        Toilet toilet
        Address address
        ...
      }
      

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-12-24
        • 2014-07-17
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多