2010-11-04 83 views
2

我有一个简单的删除方法,它从一个列出所有从数据库中的表ID:无法删除使用Spring MVC和Hibernate

@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()方法,应该删除数据。它回到列表页面,因为它应该,但它只是不会从表中删除数据。我做错了什么吗?

回答

2

你不提交事务:

public void excluir(Object obj) { 
    getSession().beginTransaction(); 
    getSession().delete(obj); 
    getSession().getTransaction().commit(); 
    getSession().close(); 
}

作为一个侧面说明,你为什么不使用Spring和综合事务管理,除去所有这些样板代码?

+0

谢谢xD我不知道如何做到这一点春天,我做的方式是我知道的唯一方法= /注:我做了你所告诉的,现在我得到这个:org.hibernate.TransactionException:事务没有成功启动) – onildo 2010-11-04 05:23:17

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); 
    } 
} 
+0

我注意到我每次调用getSession()方法都会得到一个新的会话,所以在提交时,它提交了一个不同的会话(我认为)。我刚刚添加:会话会话= getSession();使用会话,而不是getSession(),它工作得很好xD – onildo 2010-11-04 20:55:30

0

您可以添加@Transactional到控制器的方法。

当然你需要配置Spring来识别这个。 但是你可以跳过很多会话处理代码。