上一节实现了hibernate添加记录,这一节继续使用hibernate实现修改记录。
在上一节的PersonDaoSessionImpl.java中增加update方法的实现,调用hibernate的sessionFactory.getCurrentSession().update(person)方法即可。这和SpringJDBC Template使用sql来update数据效果是一样的,不过省去了写sql语句,十分简洁。
@Override public int update(Person person) throws Exception { sessionFactory.getCurrentSession().update(person); return 1; }
同时,在PersonService.java中增加一个接口的方法,
public void modify(Person person) throws Exception;
并且在PersonServiceImpl.java中实现这个接口的方法,
@Override public void modify(Person person) throws Exception { personDao.update(person); }
这样,在PersonController.java中,先按照ID把对应的person查询出来,再把需要修改的字段设置为新的值,调用PersonService的修改方法modify就可以保存这次修改的内容到数据库了。
在PersonDaoSessionImpl.java中实现getPersonById(String id)的方法,使用hibernate的sessionFactory.getCurrentSession().get(Person.class, id);方法即可按ID一次查询出某个数据记录。
@Override public Person getPersonById(String id) throws Exception { return (Person)sessionFactory.getCurrentSession().get(Person.class, Integer.parseInt(id))); }
@RequestMapping(value = "/modify") public Object modify(HttpServletRequest request, HttpServletResponse response, PersonForm personForm) { try { String id = personForm.getId(); Person person = personService.findPerson(id); person.setNation(personForm.getNation()); person.setInformation(personForm.getInformation()); person.setGender(personForm.getGender()); person.setHobby(personForm.getHobby()); person.setName(personForm.getName()); person.setPassword(personForm.getPassword()); personService.modify(person); request.getSession().setAttribute("person", person); } catch (Exception e) { e.printStackTrace(); } return "default"; }
比如要修改ID为101的数据,可以创建一个WebContent/modifyForm.jsp页面,把ID和要修改的字段使用表单显示,再把这个表单提交到PersonController的/modify方法,就可以在页面上修改数据了。
在提交过程中,可能会遇到一个异常org.hibernate.HibernateException: Could not obtain transaction-synchronized Session for current thread,这段描述说明Session没有开启得到。为了解决这个问题,需要在txAdvice中加入一个属性的配置:tx:method name="modify*" propagation="REQUIRED"以及tx:method name="find*" propagation="REQUIRED",这样再执行就没有这个问题了。这是因为在执行PersonService的findPersonById和modify方法时就要开启Hibernate的事务,这样hibernate的sessionFactory.getCurrentSession()方法才能取到会话。