Java自学之路-Java中级教程-33:Hibernate与SpringMVC实现修改和查询数据库记录update和get

上一节实现了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()方法才能取到会话



猜你喜欢

转载自blog.csdn.net/weixin_41239710/article/details/80821831