【问题标题】:Unable to delete using Spring MVC and Hibernate无法使用 Spring MVC 和 Hibernate 删除
【发布时间】:2011-05-04 21:05:40
【问题描述】:

我有一个简单的删除方法,它从一个列出所有数据库的表中获取 id:

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

【问题讨论】:

    标签: java hibernate spring orm spring-mvc


    【解决方案1】:

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

    当然,您需要配置 Spring 来识别这一点。 但是接下来你可以跳过很多会话中的事务处理代码。

    【讨论】:

      【解决方案2】:

      您可以将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);
          }
      }
      

      【讨论】:

      • 我注意到我的 getSession() 方法每次调用它时都会获得一个新会话,所以在提交时,它正在提交一个不同的会话(我认为)。我刚刚添加:Session session = getSession();,使用 session 而不是 getSession(),它工作得很好 xD
      【解决方案3】:

      你没有提交交易:

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

      顺便说一句,为什么不使用 Spring 及其集成的事务管理来删除所有这些样板代码?

      【讨论】:

      • 谢谢 xD,我不知道如何使用 spring,我所做的方式是我知道的唯一方式 =/ 注意:我按照你说的做了,现在我得到了这个:org.hibernate.TransactionException : 事务未成功启动)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多