MyEclipse有一个Hibernate的插件,用它可以快速地生成与Hibernate操作有关的代码,十分方便。初学Hibernate时,调
用着这些自动生成的代码,看着数据库中一行行操作成功的数据,喜悦之情溢于言表。
但是,今天,当我将hibernate用于项目,在Servlet环境下调用时,我需要的ServletExcpetion竟然无从产生。难道当数据
库操作失败时,Servlet容器就放过这个错吗?显然不能。然而看看自己的代码,我找不到一处强制抛出错误的地方(Eclipse会
在强制处理Exception的地方提示你)。再看看Hibernate自动生成的DAO类,果然没有一个方法抛出异常:
这些方法在内部处理的是RuntimeException。可是save()等一些数据库操作方法应该是会抛出异常的啊,按照Hibernate API,
这些方法都会抛出HibernateException。但是(看看,多曲折啊),当我在API中将HibernateException找到时,发现它竟然是
RuntimeException的子类,难怪抓不住它的!
现在我搞清楚了,操作hibernate时,该抛出异常的地方你得自己抓异常,比如:
这里不写异常也能运行,但是不符合业务逻辑的需要。因此,在可能出现异常的地方,要catch HibernateExcpetion。可是,那
些地方时可能出现异常的地方呢?参照了一些高手的代码,综合了一下他们的特点,我决定:
这样,我就抓到HibernateExcpetion了。
用着这些自动生成的代码,看着数据库中一行行操作成功的数据,喜悦之情溢于言表。
但是,今天,当我将hibernate用于项目,在Servlet环境下调用时,我需要的ServletExcpetion竟然无从产生。难道当数据
库操作失败时,Servlet容器就放过这个错吗?显然不能。然而看看自己的代码,我找不到一处强制抛出错误的地方(Eclipse会
在强制处理Exception的地方提示你)。再看看Hibernate自动生成的DAO类,果然没有一个方法抛出异常:
- public void save(Employee transientInstance) {
- log.debug("saving Employee instance");
- try {
- getSession().save(transientInstance);
- log.debug("save successful");
- } catch (RuntimeException re) {
- log.error("save failed", re);
- throw re;
- }
- }
- public void delete(Employee persistentInstance) {
- log.debug("deleting Employee instance");
- try {
- getSession().delete(persistentInstance);
- log.debug("delete successful");
- } catch (RuntimeException re) {
- log.error("delete failed", re);
- throw re;
- }
- }
- public Employee findById(java.lang.String id) {
- log.debug("getting Employee instance with id: " + id);
- try {
- Employee instance = (Employee) getSession().get(
- "apqp.hbm.admin.employee.Employee", id);
- return instance;
- } catch (RuntimeException re) {
- log.error("get failed", re);
- throw re;
- }
- }
- ///......省去其他方法
这些方法在内部处理的是RuntimeException。可是save()等一些数据库操作方法应该是会抛出异常的啊,按照Hibernate API,
这些方法都会抛出HibernateException。但是(看看,多曲折啊),当我在API中将HibernateException找到时,发现它竟然是
RuntimeException的子类,难怪抓不住它的!
现在我搞清楚了,操作hibernate时,该抛出异常的地方你得自己抓异常,比如:
- DepartmentDAO dao = new DepartmentDAO();
- Transaction t = dao.getSession().beginTransaction();
- dao.save(new Department("采购部"));
- t.commit();
- dao.getSession().close();
这里不写异常也能运行,但是不符合业务逻辑的需要。因此,在可能出现异常的地方,要catch HibernateExcpetion。可是,那
些地方时可能出现异常的地方呢?参照了一些高手的代码,综合了一下他们的特点,我决定:
- DepartmentDAO dao = new DepartmentDAO();
- Transaction t = null;
- try {
- t = dao.getSession().beginTransaction();
- dao.save(new Department("采供部"));
- t.commit();
- dao.getSession().close();
- } catch (HibernateException e) {
- // Do Some Exception Handler Operate
- if (t!=null) {
- t.rollback();
- }
- } finally {
- dao.getSession().close();
- }
这样,我就抓到HibernateExcpetion了。