私のアプリケーションは基本的に辞書です。「送信」をクリックすると、新しいWordオブジェクトがいくつかのフィールドとともにDBに保存されます。フィールドの1つはCategoryと呼ばれ、Wordがどのグループに属しているかを示します。現在、この値はWordオブジェクトのStringフィールドです。
これがjsp.fileの簡略化されたコードです
<form:form method="post" action="addNewWord.html" commandName="word" >
<table>
//many other fields;
<tr>
<td>Category:</td>
<td><form:select path="category" items="${CATEGORIES}"
var="cat">
</form:select></td>
<td><form:errors path="category" cssClass="error" /></td>
</tr>
<tr>
<td colspan="2"><input type="submit" value="Add new word" /></td>
</tr>
</table>
</form:form>
これがWordオブジェクトです。
@Entity
@Table(name = "word")
public class Word {
//other instance variables either primitives or Strings;
@Column(name = "category", nullable = false, length = 80)
private String category;
//getters-setters
この場合、すべてが正常で非常にうまく機能し、Wordオブジェクトがデータベースに保存されます。しかし、スタンドアロンのCategoryオブジェクトを作成することにし、WordオブジェクトのcategoryフィールドがStringではなく、Categoryのインスタンスである場合はどうなりますか?
@ManyToOne
@JoinColumn(name = "category_id")
private Category category;
.jspファイルのフォームを変更して、文字列ではなくカテゴリのフィールドを持つ単語オブジェクトを送信するにはどうすればよいですか?全体像として、送信によって呼び出されるコントローラーのメソッドを示します。
@RequestMapping(value = "/addNewWord", method = RequestMethod.POST)
public String addNewWord(@ModelAttribute Word word, BindingResult result, Model model) {
WordValidator validator = new WordValidator();
validator.validateWord(word, result, wordService.getAllWord(), categoryService.getAllCategories());
if (!result.hasErrors()) {
wordService.save(word);
word.clearValues();
}
fillCategoryNames(model);
return "addNew";
}
@InitBinderメソッドを使うべきだと感じていますが、その方法がわかりません。それは確かな事実というよりは感覚のようなものです。どんなアドバイスでも大歓迎です。