【问题标题】:GORM Many-to-one with mapping tableGORM 多对一与映射表
【发布时间】:2016-03-29 18:05:30
【问题描述】:

我有几个具有多对一关系的 mysql 表,它们使用映射表来建立关系。如下

book_type_map
Column         Datatype
book_id        Char(36)
book_type_id   Char(36)

book_type
Column         Datatype
book_type_id   Char(36)
book_type      Text
default        TinyInt(1)

books
Column         Datatype
book_id        Char(36)

如您所见,book 表或book_type 表没有相互引用的列,我需要能够从book 访问book_type。这些是BookBookType 的域对象

class Book {
    String id
    BookType bookType

    static mapping = {
        table 'books'
        id column: 'book_id', generator: 'uuid2'
        bookType joinTable: [ name: 'book_type_map',
                key: 'book_id',
                column: 'book_type_id']
    }
}

class BookType {
    String id 
    String type
    Boolean default

    static mapping = {
        table 'book_type'
        id column: 'book_type_id', generator: 'uuid2'
        type column: 'book_type'
    }
}

当我运行它时,当我执行 Book.findAll() 时会出现此异常

com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException:“字段列表”中的未知列“this_.book_type_id”

我认为我的映射不正确。如果有人能指出我正确的方向,我将不胜感激。

【问题讨论】:

  • 表 'books' 与您上面列出的表结构不匹配。我认为这是一个错字?
  • 这是一个错字@ErikAhlswede。

标签: mysql grails grails-orm many-to-one


【解决方案1】:

一般来说,连接表只对一对多或多对多关系有意义。在这个例子中,Book 只能有一个 BookType,那么为什么需要一个连接表呢?您将只有一个带有 BookTypeId 的列。

我认为您正在寻找的是:

class Book {
    String id

    static hasMany = [bookType: BookType]

    static mapping = {
        table 'books'
        id column: 'book_id', generator: 'uuid2'
        bookType joinTable: [ name: 'book_type_map',
                key: 'book_id',
                column: 'book_type_id']
    }
}

查看docs了解更多详情

编辑

如果你设置在这个表结构上,你可以翻转关系(不是这个的粉丝)。这种结构对我来说真的没有意义,但会起作用:

class Book {
    String id

    static mapping = {
        table 'books'
        id column: 'book_id', generator: 'uuid2'
    }
}

class BookType {
    String id 
    String type
    Boolean default

    static hasMany = [books: Book]    

    static mapping = {
        table 'book_type'
        id column: 'book_type_id', generator: 'uuid2'
        type column: 'book_type'
        books joinTable: [ name: 'book_type_map',
                key: 'book_type_id',
                column: 'book_id']
    }
}

【讨论】:

  • 你是对的,拥有一个连接表对于一对多或多对多关系是有意义的。我不确定当有映射表时我们应该如何映射多对一关系?你有什么建议吗?
  • 你试过我的建议了吗?
  • 我试过了。这样,我只能获得BookType 的列表/集,而不是 BookType 的单个对象。
  • 感谢您的建议,但是,我需要能够从Book 对象访问BookType。即使我也不喜欢表格结构,但我无法改变它。
猜你喜欢
  • 1970-01-01
  • 2021-12-26
  • 2011-03-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多