私はthymeleafとSpringとHibernateを使ってMVCアプリケーションを構築しています。ここでの私の質問は、春より冬眠についてのことです。フォームのサブミットにないエンティティ属性をヌルに更新する
これは私がこれまで行ってきたことです。
A UI
<form role="form" th:action="@{/user/{userId}/official(userId=${userId})}" th:object="${user}" method="post">
<!-- first form group -->
<div class="form-group">
<label class="control-label col-xs-2">First Name</label>
<div class="col-xs-2">
<input type="text" class="form-control" th:field="*{firstName}" placeholder="First Name" />
</div>
<label class="control-label col-xs-2">Last Name</label>
<div class="col-xs-3">
<input type="text" class="form-control" th:field="*{lastName}" placeholder="Last Name" />
<!-- first form group end -->
</div>
<br/><br/>
<!-- third form group -->
<div class="form-group">
<label class="control-label col-xs-2">Email Address</label>
<div class="col-xs-2">
<input type="text" class="form-control" th:field="*{emailAddress}" placeholder="Email Address" />
</div>
</div>
<div class="form-group">
<div class="col-xs-2">
<input type="submit" value="Update" class="btn btn-primary" />
</form>
コントローラー:
@Controller
public class UserController {
@Autowired
private IUserService userServiceImpl;
@RequestMapping(value = "/user/{userId}/official", method = RequestMethod.GET)
public String getUserOfficialInfo(@PathVariable("userId") Integer userId, Model model) throws ServiceBusinessException {
UserBO userBO = userServiceImpl.findUserByUserId(userId);
model.addAttribute("user", userBO);
model.addAttribute("userId", userId);
model.addAttribute("genders", EnumSet.allOf(Gender.class));
return "official";
}
@RequestMapping(value = "/user/{userId}/official", method = RequestMethod.POST)
public String updateUserOfficialInfo(@PathVariable("userId") String userId, @ModelAttribute("user") UserBO user,BindingResult result, Model model) throws ServiceBusinessException {
userServiceImpl.updateUser(user);
UserBO userBO = userServiceImpl.findUserByUserId(Integer.parseInt(userId));
model.addAttribute("user", userBO);
model.addAttribute("userId", userId);
model.addAttribute("genders", EnumSet.allOf(Gender.class));
return "official";
}
}
DAO:
@Override
public void updateUser(UserEntity user) throws DaoException {
entityManager.merge(user);
}
コントローラでGETメソッドは、ビューにユーザーオブジェクトを取得します。しかし、私はちょうどフォームにユーザーオブジェクトのそれらの属性のいくつかを表示しています。
送信フォームでコントローラのPOSTメソッドが呼び出され、サービスレイヤが呼び出され、DAOのマージメソッドが実行されます。
ここで私が観察したことは、エンティティマネージャのこのマージメソッドが、フォームに存在しない属性をnullに更新していることです。
POSTメソッドから呼び出されたときにオブジェクトがデタッチされるため、これが期待される動作だと思います。したがって、ここで行うべきことは、まずデータベースからエンティティオブジェクトを取得し、そのオブジェクトにフォームで変更されたフィールドを設定してから、マージメソッドを呼び出します。
私が言った以上のことが正しいかどうか知る人もいますか?
もしそうなら、私の次の質問は、これは非常に面倒であり、少し努力するものではありません。つまり、オブジェクト全体をフォームに表示したくない場合があります。また、隠されたフィールドではありません。私はこれを処理する方法がないことは非常に驚いており、毎回上記の方法に従わなければなりません。
これを行うより良い方法はありますか?代わりにJDBCテンプレートを使用するだけでいいですか?そこにボイラープレートのコードを書いていることは分かっていますが、UIへの各回の旅行の際にゲッターとセッターも書いています。
Hibernateはフォームについて何も知りません。私が見た典型的なパターンは、dbからエンティティをロードし、フォームのフィールドをエンティティにマップし、エンティティを永続化することです。私は、これを助けるためにどこかに春の配管があると信じていますが、私はそれを見つけるべき具体的なものを思い出すことはできません。 – Taylor