我有一个域类:
class Author {
String name
static hasMany = [superFantasticAndAwesomeBooks: Book, superBadAndUltraBoringBooks: Book]
}
使用内存数据库时这很好,但是,在Oracle上运行时,Book
集合在连接表中建模,由于列名太长,无法创建连接表。
所以,然后我尝试指定连接表属性:
static mapping = {
superFantasticAndAwesomeBooks joinTable: [key: awesomeBooks]
superBadAndUltraBoringBooks joinTable: [key: boringBooks]
}
问题(如果未指定joinTable
则不会发生)是创建连接表,其中对应awesomeBooks
和boringBooks
的列为NOT NULL
(它们需要可以为空,因为Book
将是awesomeBook
或boringBook
)
有没有办法配置joinTable
以允许NULL
列?
答案 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']
}