Я работаю над контроллером Spring MVC и представлениями для реализации операций CRUD для простого объекта с именем Partner. Операция обновления меня беспокоит. Кажется, мне нужно написать несколько строк кода вручную, что я ожидал, что Spring MVC позаботится автоматически. Есть ли лучшая практика, которую мне не хватает здесь?Обновление Spring MVC без избыточного кода?
Вот мое мнение:
<%@ include file="include.jsp"%>
<form:form commandName="partner">
<input type="hidden" name="_method" value="PUT" />
<table>
<tr>
<td>Id:</td>
<td><form:input path="id" disabled="true" /></td>
</tr>
<tr>
<td>Name:</td>
<td><form:input path="name" /></td>
</tr>
<tr>
<td>Logo:</td>
<td><form:input path="logo" /></td>
</tr>
<tr>
<td>On-screen text:</td>
<td><form:textarea path="onScreenText" /></td>
</tr>
<tr>
<td colspan="2"><input type="submit" value="Save Changes" /></td>
</tr>
</table>
</form:form>
И вот мой метод контроллера для операции обновления:
@RequestMapping(value="/partner/{partnerId}", method=RequestMethod.PUT)
public ModelAndView updatePartner(@ModelAttribute Partner partner, @PathVariable int partnerId) {
EntityManager entityManager = DatabaseHelper.getEntityManager();
try {
Partner partnerToUpdate = entityManager.find(Partner.class, partnerId);
entityManager.getTransaction().begin();
partnerToUpdate.setId(partnerId);
partnerToUpdate.setName(partner.getName());
partnerToUpdate.setLogo(partner.getLogo());
partnerToUpdate.setOnScreenText(partner.getOnScreenText());
entityManager.persist(partnerToUpdate);
entityManager.getTransaction().commit();
}
finally {
entityManager.close();
}
return new ModelAndView("redirect:/partner");
}
Строки кода, смущающие меня являются:
Partner partnerToUpdate = entityManager.find(Partner.class, partnerId);
partnerToUpdate.setId(partnerId);
partnerToUpdate.setName(partner.getName());
partnerToUpdate.setLogo(partner.getLogo());
partnerToUpdate.setOnScreenText(partner.getOnScreenText());
Do I действительно нужно искать существующего Партнера в базе данных и явно обновлять каждое поле этого объекта? У меня уже есть объект Partner со всеми нужными значениями. Невозможно ли сохранить этот объект непосредственно в базе данных?
Я уже просмотрел Spring MVC CRUD controller best pactice, но это не совсем отвечало на мой вопрос.
Вы можете попробовать использовать 'партнера .setId (partnerToUpdate.getId()); entityManager.merge (partner); ', но он работает только в том случае, если' partner' является полным объектом. –
@AVolpe, ваше предложение использовать слияние. –
Тогда я добавлю ответ. –