HibernateException——我要抓到你!

          MyEclipse有一个Hibernate的插件,用它可以快速地生成与Hibernate操作有关的代码,十分方便。初学Hibernate时,调

用着这些自动生成的代码,看着数据库中一行行操作成功的数据,喜悦之情溢于言表。
         
           但是,今天,当我将hibernate用于项目,在Servlet环境下调用时,我需要的ServletExcpetion竟然无从产生。难道当数据

库操作失败时,Servlet容器就放过这个错吗?显然不能。然而看看自己的代码,我找不到一处强制抛出错误的地方(Eclipse会

在强制处理Exception的地方提示你)。再看看Hibernate自动生成的DAO类,果然没有一个方法抛出异常:
 
  1. public void save(Employee transientInstance) {  
  2.     log.debug("saving Employee instance");  
  3.     try {  
  4.         getSession().save(transientInstance);  
  5.         log.debug("save successful");  
  6.     } catch (RuntimeException re) {  
  7.         log.error("save failed", re);  
  8.         throw re;  
  9.     }  
  10. }  
  11.   
  12. public void delete(Employee persistentInstance) {  
  13.     log.debug("deleting Employee instance");  
  14.     try {  
  15.         getSession().delete(persistentInstance);  
  16.         log.debug("delete successful");  
  17.     } catch (RuntimeException re) {  
  18.         log.error("delete failed", re);  
  19.         throw re;  
  20.     }  
  21. }  
  22.   
  23. public Employee findById(java.lang.String id) {  
  24.     log.debug("getting Employee instance with id: " + id);  
  25.     try {  
  26.         Employee instance = (Employee) getSession().get(  
  27.                 "apqp.hbm.admin.employee.Employee", id);  
  28.         return instance;  
  29.     } catch (RuntimeException re) {  
  30.         log.error("get failed", re);  
  31.         throw re;  
  32.     }  
  33. }  
  34.   
  35. ///......省去其他方法

这些方法在内部处理的是RuntimeException。可是save()等一些数据库操作方法应该是会抛出异常的啊,按照Hibernate API,

这些方法都会抛出HibernateException。但是(看看,多曲折啊),当我在API中将HibernateException找到时,发现它竟然是

RuntimeException的子类,难怪抓不住它的!

          现在我搞清楚了,操作hibernate时,该抛出异常的地方你得自己抓异常,比如:
 
  1. DepartmentDAO dao = new DepartmentDAO();  
  2.           
  3. Transaction t = dao.getSession().beginTransaction();  
  4.           
  5. dao.save(new Department("采购部"));  
  6.           
  7. t.commit();  
  8.           
  9. dao.getSession().close();  

这里不写异常也能运行,但是不符合业务逻辑的需要。因此,在可能出现异常的地方,要catch HibernateExcpetion。可是,那

些地方时可能出现异常的地方呢?参照了一些高手的代码,综合了一下他们的特点,我决定:
 
  1. DepartmentDAO dao = new DepartmentDAO();  
  2.           
  3. Transaction t = null;  
  4.           
  5. try {  
  6.               
  7.      t = dao.getSession().beginTransaction();  
  8.               
  9.      dao.save(new Department("采供部"));  
  10.               
  11.      t.commit();  
  12.               
  13.      dao.getSession().close();  
  14.               
  15. catch (HibernateException e) {  
  16.      // Do Some Exception Handler Operate  
  17.      if (t!=null) {  
  18.            t.rollback();  
  19.      }  
  20. finally {  
  21.      dao.getSession().close();  
  22. }  

这样,我就抓到HibernateExcpetion了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值