Database design 如何强制grails GORM尊重DB方案?

Database design 如何强制grails GORM尊重DB方案?,database-design,grails,groovy,gorm,relational-database,Database Design,Grails,Groovy,Gorm,Relational Database,我有两个领域: 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 = { ta

我有两个领域:

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'
      }
  }
实际上,通过这些模型,我得到了表格:
-代码集,
-盒式磁带,
-和表:代码集盒带(两个字段:代码集盒带id、盒带id)

我不希望设置代码\u \u盒带表,但希望保持关系:
代码集-->1:n-->盒式磁带

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


使用GORM进行映射不需要中间表?

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

因此,对于域代码集,修复方法是:

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'
      }
  }
但是,我仍然混淆了双向和单向模式?
谁能给我举个好例子(帮助我理解)?
谢谢

如果您将belongs更改为声明,它将起作用。您可以在belongsTo中命名实例,而不是仅仅引用代码集的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)”找到引用盒带的代码集实例。在您的示例中,您使用的是单向模式吗?正确的?通过使用“盒带”,我也有一个单向模式。有什么区别?单向模式和双向模式是否会影响数据库表的组织?一侧有多个,另一侧有多个,从而创建一个双向映射(因为每一侧都可以到达另一侧)。使用“盒式磁带”,您正在创建一个双向1-1。在尝试各种组合后运行“grails schema export”,查看不同生成的DDL的外观。