3

私は2.5を使用しており、注釈を介してすべてを行っています。

ユーザーがオブジェクトを編集できる簡単なフォームがあります。その背後にあるコントローラーは、オブジェクトを作成してGETでモデルに追加し、POST(送信)で変更を処理します。正常に動作しますが、理由がわかりません。オブジェクトがセッションに明示的に追加されることはなく、オブジェクトの「id」が送信メソッドに渡されることもありません。コントローラのsubmitメソッドは、オブジェクトの「id」値をどのように認識しますか?

この質問が出た理由は、上記のものとほぼ同じ別のフォーム/コントローラーがありますが、オブジェクトを@SessionAttributesに追加しない限り「機能」しないためです。違いは、この特定のコントローラーが動作するオブジェクトには、遅延ロードされた別のオブジェクトへの参照があることです(私は舞台裏でHibernateを使用しています)。親オブジェクトをSessionAttributesに配置せずにフォームを送信すると、参照オブジェクトをロードしないため、DataIntegrityViolationExceptionが発生します。

親オブジェクトを@SessionAttributesに追加すると、問題は魔法のように消えます。親オブジェクトをGETのセッションに入れても、参照オブジェクトを明示的にロードしたことがないため、魔法のように言います。したがって、null(または空のプロキシなど)である必要があります。

世界で何が起こっているのですか?助けが必要です!

4

2 に答える 2

2

オブジェクトは、送信段階で再作成される可能性が最も高いです。ID は非表示のフォーム フィールドに「保存」されている可能性があります。

セッション属性には注意する必要があります。よほどの理由がない限り、私は常にそれを避けるようにしています。Hibernate と組み合わせると、あらゆる種類の頭痛の種になる可能性があります。

必要に応じて、完全に初期化されたコピーを使用してください。

于 2010-03-08T12:24:17.363 に答える
1

コントローラのsubmitメソッドは、オブジェクトの「id」値をどのように認識しますか?

コントローラは「id」を知りません。Springはデフォルトのコンストラクターを使用して新しいオブジェクトを作成し、それにフォームデータを入力すると思います。Hibernateは、これが新しいオブジェクトであると考え、新しいIDでデータベースに保存する必要があります。

于 2010-03-06T08:49:27.813 に答える