【问题标题】:How to force grails GORM to respect DB scheme?如何强制 grails GORM 尊重 DB 方案?
【发布时间】:2010-05-14 19:44:18
【问题描述】:

我有两个域:

class CodeSet { 

  String id
  String owner
  String comments
  String geneRLF
  String systemAPF

  static hasMany = [cartridges:Cartridge]

    static constraints = {
      id(unique:true,blank:false)
    }

    static mapping = {
      table 'code_set'
      version false
      columns {
         id column:'code_set_id', generator: 'assigned'
         owner column:'owner'
         comments column:'comments'
         geneRLF column:'gene_rlf'
         systemAPF column:'system_apf'
      }
  }

and :

class Cartridge {

  String id
  String code_set_id
  Date runDate

  static belongsTo = CodeSet

    static constraints = {
      id(unique:true,blank:false)
    }

      static mapping = {
      table 'cartridge'
      version false
      columns {
         id column:'cartridge_id', generator: 'assigned'
         code_set_id column:'code_set_id'
         runDate column:'run_date'
      }
  }

实际上,使用这些模型,我得到了表格:
- 代码集,
- 墨盒,
- 和表:code_set_cartridge(两个字段:code_set_cartridges_id、cartridge_id)

我想没有 code_set_cartridge 表,但保持关系:
code_set --> 1:n --> 墨盒

换句话说,如何在没有中间表的情况下保持 code_set 和墨盒之间的关联? (在 code_set 中使用 code_set_id 作为主键,在盒中使用 code_set_id 作为外键)。

用GORM映射可以不用中间表吗?

【问题讨论】:

    标签: database-design grails groovy grails-orm relational-database


    【解决方案1】:

    如果您更改 belongsTo 声明,它会起作用。您可以在 belongsTo 中命名实例,而不是仅仅引用 CodeSet 的 id,您将获得对实例的引用并避免连接表。我还删除了冗余映射:

    class Cartridge {
    
       String id
       Date runDate
    
       static belongsTo = [codeSet: CodeSet]
    
       static mapping = {
          version false
          id generator: 'assigned'
          codeSet column:'code_set_id'
       }
    }
    
    class CodeSet { 
    
       String id
       String owner
       String comments
       String geneRLF
       String systemAPF
    
       static hasMany = [cartridges:Cartridge]
    
       static mapping = {
          version false
          id generator: 'assigned'
          geneRLF column:'gene_rlf'
          systemAPF column:'system_apf'
       }
    }
    

    【讨论】:

    • 通过使用单向模式,也没有中间表。但我对双向和单向模式感到困惑。在哪种情况下我应该使用双向和单向模式?一个例子 ?谢谢
    • 真正的决定归结为您是否想访问映射集和引用,或者只是引用。我的偏好是单向的,因为您始终可以通过“CodeSet.findAllByCartridge(this)”或“CodeSet.findAllByCartridge(cartridge)”找到引用 Cartridge 的 CodeSet 实例。
    • 在您的示例中,您使用的是单向模式?正确的 ?通过使用“墨盒墨盒”,我还有一个单向模式。有什么区别 ?单向模式和双向模式会影响数据库表的组织吗?
    • 一侧的 hasMany 和另一侧的 belongsTo 创建一个双向映射(因为每一侧都可以到达另一侧)。使用“墨盒”您正在创建一个双向 1-1。在尝试各种组合后运行“grails schema-export”以查看不同生成的 DDL 的样子。
    【解决方案2】:

    我使用的是双向一对多模式,但我也可以使用单向模式。

    所以对于域 CodeSet,修复方法是:

    class CodeSet { 
    
      String id
      String owner
      String comments
      String geneRLF
      String systemAPF
    
      Cartridge cartridge
    
        static constraints = {
          id(unique:true,blank:false)
        }
    
        static mapping = {
          table 'code_set'
          version false
          id column:'code_set_id', generator: 'assigned'
          columns {
             owner:'owner'
             comments:'comments'
             geneRLF:'gene_rlf'
             systemAPF:'system_apf'
          }
      }
    

    但是,我仍然混淆了双向和单向模式?
    有人可以给我一个很好的例子(帮助我理解)吗? 谢谢

    【讨论】:

      猜你喜欢
      • 2015-08-09
      • 2020-02-02
      • 1970-01-01
      • 1970-01-01
      • 2010-10-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-02
      相关资源
      最近更新 更多