5

我在玩 Grails,发现 ORM 的东西很乏味,因为我不完全理解我在做领域类时在做什么。我希望有人能让我重回正轨

考虑以下

测试作业 一:作业 上使用的许多硬件 许多:一个 物理硬件

...这类似于在大学数据库示例中看到的经典 Order、OrderLine、Product 场景

我创建了以下域类

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 在数据库中创建 hardware_on_job_job 和 hardware_on_job_physical_hardware。

使用脚手架控制器,我可以输入一些硬件,输入作业,然后输入将两者链接在一起。我的问题是它为什么要创建这两个额外的表,而不是使用我指定的域对象 (HardwareOnJob)。

非常感谢任何帮助/指导,因为他们会发疯地看着这个并尝试新事物。顺便说一句,我正在使用 grails 版本 1.2.1

4

5 回答 5

7

看一下joinTable关键字:

自定义用于无向一对多、多对多和原始集合类型的连接表

以下是用户指南中的示例:

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']
    }

}
于 2010-02-12T07:56:53.793 回答
1

考虑使用显式关联类/表。请参阅http://www.grails.org/Many-to-Many+Mapping+without+Hibernate+XML中的成员资格类

一个附带的好处是为关联类搭建脚手架(如果没有明确的关联类,您将无法获得它)。

于 2010-02-23T05:48:58.660 回答
0

好的,所以在玩了之后我想出了以下结构

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]
} 

这对其他人来说是否明智?已经创建的数据库结构看起来友好了很多,只有我期望的三个表。

有兴趣听听人们的想法,因为我来自关系背景。从保持报告简单的角度来看,我将对象创建视为一种提供清晰数据库设计的方法。

欢迎评论

于 2010-02-11T10:36:19.367 回答
0

简而言之,如果 Child 有一个 Parent,那么在 Parent 中,你把

static hasMany = [children: Child]

在孩子中,你把

static belongsTo = [parent: Parent]

(或者如果你不想级联,我认为只添加“父父级”就足够了,但我猜这是一种罕见的情况)

这创建了一个双向关系,在子域对象中,您可以通过属性访问父对象,而在父对象中,您拥有子集合。

通常,这将在 Child 中创建一个列,保存其 Parent 的 id。当需要某种链接表时(GORM 可以处理),这对多对多来说是不可能的。所谓的“单边”关系(正如您在第一个示例中所使用的)也可以创建链接表,这可以解释一下:

http://grails.1312388.n4.nabble.com/Many-to-many-vs-Many-to-one-td1369336.html

于 2011-02-25T13:39:56.200 回答
0

当使用一对多或多对多关系时,grails 会创建一个连接表,其中包含关系中对象的 ID。您可以通过告诉 grails 在一对多关系中使用外键来避免使用连接表。据我所知,没有办法避免在多对多关系中使用自动创建的连接表。有关更多信息,请参阅以及此的第 5.2.1.2 和 5.2.1.3 节

于 2010-02-10T17:39:43.707 回答