0

多対多の関係を持つ 2 つのオブジェクトがあります。記事はさまざまなセクションに含めることができ、セクションには多くの記事を含めることができます。

class Article {
    String title
    static belongsTo = Section
    Set<Section> sectionSet = [] as Set

    static hasMany = [
           sectionSet: Section
    ]
}

class Section {
    String title
    String uniqueUrl   // an unique identifier for the section

    List<Article> articleList = []
    static hasMany = [
            articleList: Article
    ]

    static mapping = {
        uniqueUrl(unique: true)
    }

    boolean equals(o) {
        if (this.is(o)) return true
        if (getClass() != o.class) return false

        Section section = (Section) o

        if (uniqueUrl != section.uniqueUrl) return false

        return true
    }

    int hashCode() {
        return uniqueUrl.hashCode()
    }

}

次のようにコントローラーからパラメーターをバインドして、新しい記事を作成します。

params = [title: "testArticle", "sectionSet[0].id": "1"] // a section with ID=1 exists in database
Article article = new Article(params) // NullPointerException here because I add this article into the section and uniqueUrl for calculating hashCode() is null

ID 1 のセクションが db から読み込まれず、そのフィールドがすべて null であるため、hashCode で問題が発生しました。この例は、equals と hashCode をオーバーライドしなければ問題なく動作しますが、セット内のオブジェクトを使用する場合はオーバーライドする必要があると思います...

これを解決する方法を知っている人はいますか?

4

1 に答える 1

0
  1. List sectionSet[0].id のインデックスにバインドする場合は、Set を使用しないでください !!! リストのみ!!!
  2. コマンド オブジェクトを使用します。
  3. 記事を追加する必要があります:

    def selectedSections = Section.findAll(params.list('section.id'));

    def article = new Article(params)

    selectedSections.each{ it.addToArticleList(article).save(true) }

于 2013-10-03T12:10:09.587 に答える