0

私はドメインクラスを持っています:

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

これは、インメモリデータベースを使用する場合はすべて便利ですが、Oracleで実行する場合、Bookコレクションは、列名が長すぎるために作成できない結合テーブルでモデル化されます。

そこで、結合テーブルのプロパティを指定してみました。

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

問題(指定されていない場合は発生しません)は、列がに対応する場所にjoinTable結合テーブルが作成されることです(aはまたはになるためnull許容である必要があります)awesomeBooksboringBooksNOT NULLBookawesomeBookboringBook

joinTableを許可するように構成する方法はありますか?NULL

4

2 に答える 2

0

もう1つのオプションは、結合テーブルを自分でDomainクラスにマップすることです。次に例を示します。

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]
}

このようにして、ステータスは結合の値として保存され、ステータスは将来必要に応じて追加、更新、または削除できます。関連するBooksにアクセスするために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 に答える