0

1 対多の関係の親と子を一度に永続化する必要があります。問題のドメイン オブジェクトはProjectand ProductLineItem(a Projecthas many ProductLineItems) です。

ユーザーが 'products' テーブルに 1 つ以上の行を追加できるページを作成しました。ユーザーがフォームを送信したときに、各行を新しいProductLineItem( が所有する) として保持したいと考えています。Project

初めてドメイン オブジェクトを保存するとうまくいきますが、(更新ページを介して) 同じオブジェクト セットを更新しようとすると、コントローラーで IndexOutOfBoundsException が発生します。

projectInstance.properties = params

productLineItemsコレクションを次のように宣言することで、これを修正できますProject-

Collection<ProductLineItem> productLineItems = ListUtils.lazyList(new ArrayList(), {new ProductLineItem()} as org.apache.commons.collections.Factory)

ただし、何らかの理由で、これによりProductLineItem.project、最初の保存を行うときにプロパティが設定されなくなります。

Grails 2.2.2 を使用しています。何か案は?

4

1 に答える 1

1

コレクションをバッグとして宣言すると、Grails が外部キー制約を設定するのを妨げているようです。

変えることで

Collection<ProductLineItem> productLineItems = ListUtils.lazyList(new ArrayList(), {new ProductLineItem()} as org.apache.commons.collections.Factory)

List<ProductLineItem> productLineItems = ListUtils.lazyList(new ArrayList(), {new ProductLineItem()} as org.apache.commons.collections.Factory)

問題を解決できました。

編集:

価値のあることとして、私はリストを使用したくなかったので (1 対多の関係コレクションにリストを使用すると、「ギャップ」が表示されるという問題に常に遭遇するようです)、コードをいじり続けました。

次のようにバッグを宣言すると:

Collection<ProductLineItem> productLineItems = ListUtils.lazyList(new ArrayList(), {new ProductLineItem()} as org.apache.commons.collections.Factory)

その場合、親への参照は子エンティティ内に設定されません。ただし、次のようにバッグを宣言すると:

Collection productLineItems

それは動作します!また、コレクションも自動拡張されます!

まだコードをテストしていますが、今のところうまくいっています。

于 2013-07-02T13:32:51.097 に答える