Учитывая очень простой объект:
class User {
private Integer id;
private String name;
public User() {}
public Integer getId() { return id; }
public String getName() { return name; }
public void setName(String name) { this.name = name; }
}
и очень простое действие контроллера:
@RequestMapping(value="/edit/{id}/**", method=RequestMethod.POST)
public String editFromForm(@PathVariable("id") Integer id, @Valid User user, BindingResult bindingResult, Model model) {
// If we have errors, don't save
if(bindingResult.hasErrors()) {
// Put what they did in the model and send it back
model.addAttribute(user);
return "users/edit";
} else {
userDAO.save(user);
}
// Show them the updated page on success
return "redirect:/users/" + user.getId() + "/" + user.getName();
}
и очень простую форму:
<sf:form method="POST" modelAttribute="user">
<label for="user_name">Name:</label>
<sf:input path="name" id="user_name" />
<input type="submit" value="save" /><sf:errors path="name" cssClass="error" />
</sf:form>
Как должен Обновлять сущность в базе данных?В настоящее время (поскольку saveOrUpdate()
является фактическим вызовом гибернации за методом save()
моего DAO, новый объект сохраняется вместо обновления существующего, поскольку поле id
не устанавливается для объекта, созданного из представления формы.
Пара возможных решений пришла ко мне, но я не уверен, что лучше всего с точки зрения поддержания чистоты и безопасности (чтобы злоумышленник не мог просто запускать изменения в любом идентификаторе объекта, который он желает).
- Вставьте идентификатор из параметра URL-адреса в объект, идущий из подшивки модели
- Имейте скрытое поле
id
в форме и позвольте подшивке модели присоединить идентификатор
В обоих случаях нет проверки, чтобы убедиться, что объект все тот же, такой как какая-то контрольная сумма. Как другие справляются с этим?Наглядный пример, который проходит через эту проблему?
Другая проблема, которая возникает, состоит в том, что я предпочел бы не нуждаться в методе setId()
, так как Hibernateуправляет всеми идентификаторами.Из того, что я смог определить, связыватель модели Spring MVC может связывать поле только в том случае, если у него есть ожидаемые методы получения и установки.Есть ли другой способ применить новое состояние, например получить текущего пользователя из БД по параметру id
URL-адреса, а затем применить к нему новое состояние, но без необходимости явного кодирования всех копий поля?
Я уверен, что есть довольно простой и простой способ справиться с этим, но мой мозг, перегруженный теплом, похоже, не может найти подходящее решение.
Я довольно новв Spring + Hibernate, так что прости меня, если это одна из тех обыденных, широко освещаемых тем, но я не смог найти ни одного четкого примера, который бы охватывал мою очень простую ситуацию.Если это достаточно покрыто , пожалуйста, укажите мне правильное направление.