我有一个简单的删除方法,它从一个表中获取id,该表列出了db:
中的所有内容@RequestMapping(value = "/personagem/excluir.htm")
public ModelAndView doExcluir(@RequestParam("id") int id) {
logger.info("Recebendo parametro: {Id => " + id + "}");
try {
Personagem p = getPersonagemService().buscarPorId(id);
logger.info("Excluindo personagem: {Id => " + p.getId() + ", Nome => " + p.getNome() + ", Classe => " + p.getClasse() + "}");
getPersonagemService().excluir(p);
return new ModelAndView("excluir");
} catch (Exception ex) {
return new ModelAndView("erro", "mensagem", "Ocorreu um erro: " + ex);
}
}
继承我的dao中的删除方法:
public void excluir(Object obj) {
getSession().beginTransaction();
getSession().delete(obj);
getSession().flush();
getSession().close();
}
我单击删除按钮,调用doExcluir()方法,该按钮应该删除数据。它会回到列表页面,但它不会从表中删除数据。我做错了什么?
答案 0 :(得分:2)
您没有提交交易:
public void excluir(Object obj) {
getSession().beginTransaction();
getSession().delete(obj);
getSession().getTransaction().commit();
getSession().close();
}
作为旁注,为什么不使用Spring及其集成的事务管理来删除所有这些样板代码?
答案 1 :(得分:1)
您可以将Spring's pet-clinic示例作为参考。我为您的案例提供了相关部分:
public class HibernateClinic implements Clinic {
private SessionFactory sessionFactory;
@Autowired
public HibernateClinic(SessionFactory sessionFactory) {
this.sessionFactory = sessionFactory;
}
public void deletePet(int id) throws DataAccessException {
Pet pet = loadPet(id);
sessionFactory.getCurrentSession().delete(pet);
}
}
答案 2 :(得分:0)
您可以将@Transactional
添加到控制器方法中。
当然,你需要配置Spring来识别它。 但是,您可以跳过很多会话的事务处理代码。