【问题标题】:Many-to-Many link tables in grails (GORM) / hibernategrails (GORM) / hibernate 中的多对多链接表
【发布时间】:2011-01-15 09:05:24
【问题描述】:

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

考虑以下

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

...这类似于在大学数据库示例中看到的经典 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 版

【问题讨论】:

    标签: hibernate grails many-to-many grails-orm ejb-3.0


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      考虑使用显式关联类/表。查看http://www.grails.org/Many-to-Many+Mapping+without+Hibernate+XML中的会员等级

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

      【讨论】:

        【解决方案3】:

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

        【讨论】:

          【解决方案4】:

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

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

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

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

          欢迎评论

          【讨论】:

          • 我想说,对于许多应用程序来说,由 Grails 创建的数据库结构并不重要,因为它足够快并且没有足够的数据需要数据库调优。我正在开发一个 Grails 应用程序,我什至还没有看到数据库结构(使用内存数据库)。但是,当您知道您的 Grails 应用程序会给数据库带来压力时,您最好从一开始就对其进行调整,否则以后更改域类会很痛苦。
          • 为什么要指定 id 列?您应该完全删除 id 列的映射。
          • 如果你能告诉我为什么我应该这样做,这将有助于我的理解,因为我说我是 grails 的新手。许多开发人员完全无视数据库并将其视为一些愚蠢的存储层。考虑应用程序何时上线并且数据开始积累。我想要一个可以轻松编写报告的漂亮且易于理解的数据库设计。链接表的原因是我想存储一个像 quantity inline 这样的项目,其中包含将表链接在一起的字段。考虑构成发票的订单行。希望一切都有意义。
          【解决方案5】:

          简单地说,如果 Child 有一个 Parent,那么在 Parent 中,你放

          static hasMany = [children: Child]
          

          在 Child 中,你放

          static belongsTo = [parent: Parent]
          

          (或者如果您不想级联,我认为只需添加“父级父级”就足够了,但我猜这种情况很少见)

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

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

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多