0

我有一个域类:

class Author {
    String name
    static hasMany = [superFantasticAndAwesomeBooks: Book, superBadAndUltraBoringBooks: Book]
}

当使用内存数据库时,这一切都很好,但是,当在 Oracle 上运行时,Book集合在连接表中建模,因为列名太长而无法创建。

所以,然后我尝试指定连接表属性:

static mapping = {
    superFantasticAndAwesomeBooks joinTable: [key: awesomeBooks]
    superBadAndUltraBoringBooks joinTable: [key: boringBooks]
}

问题(如果未指定,则不会发生joinTable)是连接表是在与awesomeBooks和对应的列的位置创建boringBooksNOT NULL(它们需要为空,因为 aBook将是 anawesomeBook或 a boringBook

有没有办法配置joinTable允许NULL列?

4

2 回答 2

0

另一种选择是自己使用域类映射连接表,例如:

class AuthorBook {
    Author author
    Book book
    String status

    static constraints = {
        author(nullable:false)
        book(nullable:false)
        status(nullable:false,inList:['SuperFantasticAndAwesome','SuperBadAndUltraBoring'])
    }
}

所以你的 Author 类变成:

class Author {
    ...
    static hasMany = [authorBooks:AuthorBook]
}

通过这种方式,状态被存储为连接的值,并且可以在将来根据需要添加、更新或删除状态。它确实具有必须通过 AuthorBook 类查询以获取相关书籍的副作用。

另见: http: //grails.org/Many-to-Many+Mapping+without+Hibernate+XML

于 2012-06-14T16:02:30.833 回答
0

我刚刚使用了 2 个连接表:

static mapping = {
    superFantasticAndAwesomeBooks joinTable: [name: 'awesomeBooks', key: 'book_id']
    superBadAndUltraBoringBooks joinTable: [name: 'boringBooks', key: 'book_id']
}
于 2012-06-24T23:37:11.970 回答