2010-11-04 84 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來識別這個。 但是你可以跳過很多會話處理代碼。