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

K2J*_*K2J 4 grails many-to-many hibernate grails-orm ejb-3.0

我正在和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 
}
Run Code Online (Sandbox Code Playgroud)

我需要问的问题是为什么Grails在我的数据库中创建了两个额外的表而不是使用我定义的链接实体/域类.例如,Grails在数据库中创建hardware_on_job_job和hardware_on_job_physical_hardware.

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

任何帮助/指导都会非常感激,因为我们正在努力寻找新的东西.顺便说一下,我的版本是1.2.1

Hei*_*ter 6

看一下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']
    }

}
Run Code Online (Sandbox Code Playgroud)


Jar*_*red 0

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