我有几个具有多对一关系的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_type访问book。这些是我的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()时出现此异常



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

最佳答案

通常,拥有联接表仅对一对多或多对多关系有意义。在此示例中,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']
    }
}

10-06 06:16