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的外观。