Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/joomla/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Spring框架-在DB中创建新对象,而不是更新_Spring_Spring Mvc - Fatal编程技术网

Spring框架-在DB中创建新对象,而不是更新

Spring框架-在DB中创建新对象,而不是更新,spring,spring-mvc,Spring,Spring Mvc,我有一个用Spring3.0编写的应用程序,它使用Hibernate连接到数据库。我有一个控制器来更新表单。无论何时提交表单,我都希望显示的对象会更新,但是会使用新的ID值创建一个新对象。我看过“宠物诊所”的样本,看不出有什么不同 波乔 控制器 public class PersonUpdateController { //injected private PersonService personService; @RequestMapping(value="/pers

我有一个用Spring3.0编写的应用程序,它使用Hibernate连接到数据库。我有一个控制器来更新表单。无论何时提交表单,我都希望显示的对象会更新,但是会使用新的ID值创建一个新对象。我看过“宠物诊所”的样本,看不出有什么不同

波乔

控制器

public class PersonUpdateController
{
    //injected
    private PersonService personService;

    @RequestMapping(value="/person/{personId}/form", method=RequestMethod.POST) 
    public String updateForm(ModelMap modelMap, @PathVariable personId)
    {
        Person person = personService.getById(personId);
        modelMap.addAttribute(person);
        return "person/update";     
    }

    @RequestMapping(value="/person/{personId}", method=RequestMethod.POST)
    public String update(ModelMap modelMap, @Valid Person person, BindingResult bindingResult)
    {
        if(bindingResult.hasErrors())
        {
            modelMap.addAttribute(person);
            return "person/update";
        }

        personService.save(person);

        return "redirect:person/" + person.getId() + "/success";
    }
}
JSP


SpringMVC对HTML表单没有任何魔力。由于表单只包含一个字段,所以在更新方法中只填充了一个字段。因此,您有两种选择:

  • id
    作为隐藏字段传递,格式为:
    。注意,在这种情况下,您需要检查可能的安全后果(如果恶意人员更改id会发生什么情况)
  • 在会话中存储
    Person
    ,以便使用表单中的数据更新存储的对象(注意,如果在一个会话中打开多个表单实例,则可能会造成干扰)。宠物诊所就是这样做的:
-


SpringMVC对HTML表单没有任何魔力。由于表单只包含一个字段,所以在更新方法中只填充了一个字段。因此,您有两种选择:

  • id
    作为隐藏字段传递,格式为:
    。注意,在这种情况下,您需要检查可能的安全后果(如果恶意人员更改id会发生什么情况)
  • 在会话中存储
    Person
    ,以便使用表单中的数据更新存储的对象(注意,如果在一个会话中打开多个表单实例,则可能会造成干扰)。宠物诊所就是这样做的:
-


我们可以从
personService.save(person)
中查看相关行吗?根据JacobM的请求添加了save方法。我们可以从
personService.save(person)
中查看相关行吗?根据JacobM的请求添加了save方法。这正是我缺少的!谢谢这正是我错过的!谢谢
public class PersonUpdateController
{
    //injected
    private PersonService personService;

    @RequestMapping(value="/person/{personId}/form", method=RequestMethod.POST) 
    public String updateForm(ModelMap modelMap, @PathVariable personId)
    {
        Person person = personService.getById(personId);
        modelMap.addAttribute(person);
        return "person/update";     
    }

    @RequestMapping(value="/person/{personId}", method=RequestMethod.POST)
    public String update(ModelMap modelMap, @Valid Person person, BindingResult bindingResult)
    {
        if(bindingResult.hasErrors())
        {
            modelMap.addAttribute(person);
            return "person/update";
        }

        personService.save(person);

        return "redirect:person/" + person.getId() + "/success";
    }
}
<spring:url value="/person/${person.id}" var="action_url" />
<spring:form action="${action_url}" modelAttribute="person" method="POST">

<spring:input name="name" path="name" />

<input type="submit" value="Save" />

</spring:form>
public class HibernatePersonService
    implements PersonService
{
    //injected
    private SessionFactory sessionFactory;

    //other methods

    public void save(Person person)
    {
        Session session = sessionFactory.getCurrentSession();
        session.saveOrUpdate(person);
    }
}
@SessionAttributes("person")
public class PersonUpdateController {
    ...

    @RequestMapping(value="/person/{personId}", method=RequestMethod.POST) 
    public String update(ModelMap modelMap, @Valid Person person, 
        BindingResult bindingResult, SessionStatus status) 
    { 
        ...
        personService.save(person);
        status.setComplete(); // Removes person from the session after successful submit
        ...
    }

    @InitBinder
    public void setAllowedFields(WebDataBinder dataBinder) {
        dataBinder.setDisallowedFields("id"); // For security
    }
}