grails(GORM)/hibernate中的多对多链接表
我正在研究Grails,发现ORM的东西很乏味,因为我不完全理解我在域类中所做的事情。我希望有人能让我重回正轨 考虑以下几点 测试作业One:Many作业上使用的硬件Many:One物理硬件 …这类似于大学数据库示例中的经典订单、订单线和产品场景 我已经创建了以下域类grails(GORM)/hibernate中的多对多链接表,hibernate,grails,many-to-many,gorm,ejb-3.0,Hibernate,Grails,Many To Many,Gorm,Ejb 3.0,我正在研究Grails,发现ORM的东西很乏味,因为我不完全理解我在域类中所做的事情。我希望有人能让我重回正轨 考虑以下几点 测试作业One:Many作业上使用的硬件Many:One物理硬件 …这类似于大学数据库示例中的经典订单、订单线和产品场景 我已经创建了以下域类 class Job { String jobName String jobDescription } class HardwareOnJob { static hasMany = [ jobs:Job, phys
class Job
{
String jobName
String jobDescription
}
class HardwareOnJob
{
static hasMany = [ jobs:Job, physicalHardware:PhysicalHardware ]
static belongsTo = Job
String role
}
class PhysicalHardware
{
String assetName
String model
String os
}
我需要问的问题是,为什么Grails在数据库中为我创建了两个额外的表,而不是使用我定义的链接实体/域类。例如,Grails在数据库中创建硬件在作业上和硬件在作业上物理硬件
使用脚手架控制器,我可以输入一些硬件,输入作业,然后输入链接,将两者连接在一起。我的问题是,为什么它要创建这两个额外的表,而不是使用我指定的域对象(HardwareOnJob)
任何帮助/指导都将非常感谢,因为看到这一点并尝试新事物时会发疯。顺便说一句,当使用一对多或多对多关系时,我使用的是grails版本1.2.1,grails创建了一个包含关系中对象ID的联接表。通过告诉grails在一对多关系中使用外键,可以避免使用联接表。据我所知,无法避免在多对多关系中使用自动创建的联接表。有关更多信息,请参见的第5.2.1.2节和第5.2.1.3节,以及好的。因此,在讨论之后,我提出了以下结构
class Job
{
String jobName
String jobDescription
static mapping = {
id column:"jobId"
}
static hasMany = [hardware:HardwareOnJob]
}
class HardwareOnJob
{
String role
Job job
PhysicalHardware hardware
static mapping = {
id column:"hardware_on_job_id"
}
}
class PhysicalHardware
{
String assetName
String model
String os
static mapping = {
id column:"physical_hardware_id"
}
static hasMany = [hardwareOnjob:HardwareOnJob]
}
这对其他人来说是否合理?创建的数据库结构看起来更友好,只有我期望的三个表
我有兴趣听到人们的想法,因为我来自一个关系背景。我将对象创建视为一种手段,从保持简单报告的角度给出清晰的db设计
欢迎评论查看关键字,该关键字:
自定义用于无向一对多、多对多和基元集合类型的联接表
以下是《用户指南》中的示例:
class Book {
String title
static belongsTo = Author
static hasMany = [authors:Author]
static mapping = {
authors joinTable:[name:"mm_author_books", key:'mm_book_id' ]
}
}
class Author {
String name
static hasMany = [books:Book]
static mapping = {
books joinTable:[name:"mm_author_books", key:'mm_author_id']
}
}
考虑使用显式关联类/表。请参阅中的成员类
一个附带的好处是为关联类搭建脚手架(如果没有显式的关联类,您将无法获得此效果)。简单地说,如果孩子只有一个家长,那么在家长中,您将
static hasMany = [children: Child]
在孩子身上,你把
static belongsTo = [parent: Parent]
(或者,如果您不希望级联,我认为只添加“Parent-Parent”就足够了,但我想这是一种罕见的情况)
这将创建一个双向关系,在子域对象中,您可以通过属性访问父对象,在父对象中,您拥有子集合
通常,这将在Child中创建一列,保存其父级的id。当需要某种类型的链接表时(GORM可以处理这个问题),多对多的情况就不可能是这样了。所谓的“单边”关系(如第一个示例中所示)也可以创建链接表,如下所述:
我想说,对于许多应用程序来说,Grails创建的数据库结构并不重要,因为它速度足够快,并且没有足够的数据需要数据库调优。我正在开发一个Grails应用程序,我甚至还没有看到DB结构(使用内存中的DB)。但是,当您知道Grails应用程序将给DB带来压力时,最好从一开始就对其进行调整,否则以后更改域类会很痛苦?您应该完全删除id列的映射,如果您能告诉我为什么要这样做,这将有助于我的理解,就像我说的我是grails新手一样。许多开发人员完全无视数据库,将其视为一个愚蠢的存储层。考虑应用程序何时处于活动状态并且数据开始累积。我想要一个好的和可理解的数据库设计,我可以写报告,很容易。使用链接表的原因是,我希望存储一个类似Quantity的项目,并将链接表的字段内联。考虑一个组成发票的订单行。希望一切都有意义。