连接表中的列不是NULL

时间:2012-06-13 06:17:39

标签: grails gorm

我有一个域类:

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

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

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

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

问题(如果未指定joinTable则不会发生)是创建连接表,其中对应awesomeBooksboringBooks的列为NOT NULL (它们需要可以为空,因为Book将是awesomeBookboringBook

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

2 个答案:

答案 0 :(得分:0)

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

class AuthorBook {
    Author author
    Book book
    String status

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

所以你的作者类变成了:

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

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

另请参阅:http://grails.org/Many-to-Many+Mapping+without+Hibernate+XML

答案 1 :(得分:0)

我最终使用了2个连接表:

static mapping = {
    superFantasticAndAwesomeBooks joinTable: [name: 'awesomeBooks', key: 'book_id']
    superBadAndUltraBoringBooks joinTable: [name: 'boringBooks', key: 'book_id']
}