Spring MVC 3.0: ¿Cómo se unen a un objeto persistente
-
01-10-2019 - |
Pregunta
Estoy trabajando con Spring MVC y me gustaría que se una a un objeto persistente de la base de datos, pero no puedo averiguar cómo puedo configurar mi código para hacer una llamada a la base de datos antes de la unión. Por ejemplo, yo estoy tratando de actualizar un objeto "BenefitType" a la base de datos, sin embargo, yo quiero que esté la base de datos de objetos fromthe, no crear uno nuevo, así que no tengo que actualizar todos los campos.
@RequestMapping("/save")
public String save(@ModelAttribute("item") BenefitType benefitType, BindingResult result)
{
...check for errors
...save, etc.
}
Solución 2
Así que terminé resolver esto mediante la anotación de un método con un @ModelAttribute del mismo nombre de la clase. Primavera construye el modelo primero antes de ejecutar la asignación de solicitud:
@ModelAttribute("item")
BenefitType getBenefitType(@RequestParam("id") String id) {
// return benefit type
}
Otros consejos
Hay varias opciones:
-
En el caso más simple cuando el objeto tiene propiedades sólo simples que puede unir todas sus propiedades a los campos de formulario (
hidden
si es necesario), y obtener un objeto totalmente consolidados después de someterse. propiedades complejos también se pueden unir a los campos de formulario utilizandoPropertyEditor
s. -
También puede utilizar la sesión para almacenar su objeto entre las solicitudes y
GET
POST
. Spring 3 faciliates este enfoque con la anotación@SessionAttributes
(de la Petclinic muestra ):@Controller @RequestMapping("/owners/*/pets/{petId}/edit") @SessionAttributes("pet") // Specify attributes to be stored in the session public class EditPetForm { ... @InitBinder public void setAllowedFields(WebDataBinder dataBinder) { // Disallow binding of sensitive fields - user can't override // values from the session dataBinder.setDisallowedFields("id"); } @RequestMapping(method = RequestMethod.GET) public String setupForm(@PathVariable("petId") int petId, Model model) { Pet pet = this.clinic.loadPet(petId); model.addAttribute("pet", pet); // Put attribute into session return "pets/form"; } @RequestMapping(method = { RequestMethod.PUT, RequestMethod.POST }) public String processSubmit(@ModelAttribute("pet") Pet pet, BindingResult result, SessionStatus status) { new PetValidator().validate(pet, result); if (result.hasErrors()) { return "pets/form"; } else { this.clinic.storePet(pet); // Clean the session attribute after successful submit status.setComplete(); return "redirect:/owners/" + pet.getOwner().getId(); } } }
Sin embargo, este enfoque puede causar problemas si varios casos de la forma están abiertos de forma simultánea en la misma sesión.
-
Por lo tanto, el método más fiable para los casos complejos es crear un objeto separado para almacenar los campos de formulario y los cambios de combinación de ese objeto en objeto persistente manualmente.
Si bien es posible que su modelo de dominio es tan simple que puede enlazar IU objetos directamente a los objetos del modelo de datos, es más probable que esto no es así, en cuyo caso yo recomendaría a diseñar una clase específica para la forma La unión, luego traducir entre él y los objetos de dominio en su controlador.
Estoy un poco confundido. Creo que en realidad se está hablando de un flujo de trabajo de actualización?
Se necesitan dos @RequestMappings, uno para GET y POST uno:
@RequestMapping(value="/update/{id}", method=RequestMethod.GET)
public String getSave(ModelMap model, @PathVariable Long id)
{
model.putAttribute("item", benefitDao.findById(id));
return "view";
}
A continuación, en el poste de actualizar realmente el campo.
En usted ejemplo anterior, su @ModelAttribute ya debería estar rellena con un método como el método anterior, y las propiedades obligarse usando algo como JSTL o primavera tabglibs en conjunción con el objeto de formulario de soporte.
También es posible que desee ver en InitBinder dependiendo de su caso de uso.