Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
grails(GORM)/hibernate中的多对多链接表_Hibernate_Grails_Many To Many_Gorm_Ejb 3.0 - Fatal编程技术网

grails(GORM)/hibernate中的多对多链接表

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

我正在研究Grails,发现ORM的东西很乏味,因为我不完全理解我在域类中所做的事情。我希望有人能让我重回正轨

考虑以下几点

测试作业One:Many作业上使用的硬件Many:One物理硬件

…这类似于大学数据库示例中的经典订单、订单线和产品场景

我已经创建了以下域类

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的项目,并将链接表的字段内联。考虑一个组成发票的订单行。希望一切都有意义。