【问题标题】:Grails: Collection in domain object without hasManyGrails:没有hasMany的域对象中的集合
【发布时间】:2011-10-09 17:12:11
【问题描述】:

我有两个域对象 A 和 B。

A 可以与许多 B 相关联,但我不希望从 A 到 B 的任何保存级联。

我正在考虑定义从 A 到 B 的 hasMany 关系,然后设置级联行为。有什么想法吗?

这是我的域对象的示例:

A类{

静态 hasMany = [蜜蜂:B] }

B类{ }

【问题讨论】:

    标签: grails


    【解决方案1】:

    如果您不希望 GORM 管理您收藏的保存/更新,请不要使用 hasMany。而是将其视为一个简单的 HashSet 属性。

    【讨论】:

    • 嗯,我试过了,但是没有用。我在域对象 A 中放置了一个“Set bees”属性,但这什么也没做。 Grails 似乎不知道 Set 包含什么,也无法为其创建映射表。
    【解决方案2】:

    为什么不在 B 上使用“belongsTo”,也不在 A 上声明任何内容?这样您将获得“A”的外键,但对“A”的操作不会影响“B”。您失去了一点便利,但仍然可以通过“A”轻松查找所有“B”。我实际上更喜欢这个,因为我不需要担心延迟加载陷阱和休眠会在我只是尝试添加一个“B”时加载所有“B”(假设您不需要该功能)。

    class A{}
    
    class B{
      static belongsTo = [your_a:A]
     }
    
     //get your B's for a given A
      B.findAllByA(your_A_instance, ...paging, etc...)
    

    【讨论】:

      【解决方案3】:

      您可以在 Domain 类的 static mappings 块中定义自己的级联行为。

      请看这里:http://grails.org/doc/latest/ref/Database%20Mapping/cascade.html

      【讨论】:

      • 我知道,但问题是没有选项说级联:'none'。这种行为是我正在寻找的,一个 hasMany 关联,但绝对没有级联。
      • 你试过'none'这个值吗? Hibernate 文档似乎说有一个“无”选项,如果 Grails 是 Hibernate 上的一个层,它可能会通过。
      【解决方案4】:

      如果你在说我认为你在说的,那么你在说的不是级联的。一个简单的课程大纲会很有帮助。如果您有一个与B 的许多实例相关联的A 实例,那么所有引用A 实例的B 实例都引用了完全相同的对象 .我遇到了同样的问题并问了类似的问题here。基本上你的选择是:

      1.) 只要A 的实例发生更改或您认为合适,就克隆它。

      2.) 在您的 B 类中创建新字段,该字段将保存您关注的 A 的值。

      这两种方法各有优缺点,但对我来说,选项 2 被证明是更好的选择。

      【讨论】:

        猜你喜欢
        • 2014-07-17
        • 1970-01-01
        • 2011-09-11
        • 1970-01-01
        • 2017-11-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多