`
trace
  • 浏览: 125463 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

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了。
分享到:
评论

相关推荐

    org.hibernate.HibernateException: No Hibernate Session bound to thread

    在 Java web 开发中, Hibernate 是一个非常流行的 ORM(Object-Relational Mapping)框架,用于将 Java 对象映射到关系数据库中。然而,在使用 Hibernate 进行数据库操作时,经常会遇到 "No Hibernate Session ...

    解决SpringDataJPA报错:org.hibernate.HibernateException: Access to DialectResolutionInfo cannot be null w

    问题描述 用SpringBoot + Spring Data JPA操作数据库 项目启动的时候 报了一个错 SpringBoot的版本是2.2.6.RELEASE org.springframework.beans.factory.BeanCreationException: Error creating bean with name '...

    一个用ssh编程时的问题

    这涉及到ORM(对象关系映射)的概念与Hibernate的具体操作方法。 ### 基于名称查询Admin 在描述中提到的问题之一是如何通过Admin的名字查询一个Admin实例。解决这一问题的关键在于构造正确的HQL(Hibernate Query ...

    Hibernate实例2012-3-6-MyEclipse

    public void addUser(TUser user) throws HibernateException { Transaction tx = null; TUserDAO dao = new TUserDAO(); try { tx = dao.getSession().beginTransaction(); // 开始事务 dao.save(user); // ...

    Hibernate源代码分析

    首先,从 org.hibernate.cfg.Configuration.java 开始,使用 Hibernate 框架实现应用程序,首先就要与 org.hibernate.cfg.Configuration 打交道,要使用 Configuration.buildSessionFactory() 方法获得一个 ...

    深入浅出Hibernate中文版 part2

    6.8 HibernateException,Checked 6.9 Template/Callback 简化业务方法 6.10 版面:一棵自身循环的树 6.11 版面与帖子:Master/Detail 主从关系 6.12 帖子树及其分页 6.13 与Web层交互 6.14 帖子的多形扩展:...

    深入浅出Hibernate中文版 part1

    6.8 HibernateException,Checked 6.9 Template/Callback 简化业务方法 6.10 版面:一棵自身循环的树 6.11 版面与帖子:Master/Detail 主从关系 6.12 帖子树及其分页 6.13 与Web层交互 6.14 帖子的多形扩展:...

    Hibernate源代码分析(一)

    Hibernate 源代码分析 (一):设计属于我的 SessionFactory 和 ConnectionProvider 在这篇文章中,我们将探讨 Hibernate 框架的源代码,了解 SessionFactory 和 ConnectionProvider 的实现机制。首先,我们需要了解 ...

    NHibernate实现ORM

    当涉及到数据修改时,需引入事务管理,确保数据一致性: ```csharp Configuration cfg = new Configuration().Configure(); ISessionFactory factory = cfg.BuildSessionFactory(); using(ISession session = ...

    一个Hibernate 的简单教程

    接着,你需要下载并准备Hibernate所需的JAR文件,这些文件包含了Hibernate的核心库和其他依赖,如JDBC驱动,以便连接到数据库。在这个例子中,我们将使用MySQL数据库,因此还需要安装MySQL并创建对应的数据库和表。 ...

    com.microsoft.sqlserver.jdbc.SQLServerException: 只进结果集不支持请求的操作 解决方案

    这是因为只进结果集是为了提高性能而设计的,它允许数据只能向前读取,不能回溯或重复访问,因此不支持随机访问特性,如跳转到结果集中的任意位置。 ### Hibernate与Struts分页机制 在使用Hibernate和Struts框架...

    hibernate介绍与动手入门体验

    这样做可以减少不必要的数据库访问,提高性能。 - **如何在控制台显示SQL语句?** - 在配置文件hibernate.cfg.xml中,添加`<property name="show_sql">true</property>`即可。 通过以上的讲解,我们不仅了解了...

    Hibernate开发指南

    要使用Hibernate,首先需要将其库文件添加到项目类路径中,然后配置hibernate.cfg.xml文件,包括数据库连接信息、方言选择、缓存设置等。同时,也需要在应用中初始化SessionFactory。 3. 实体与映射 Hibernate的...

    J2EE利用Hibernate采用B/S架构网页设计

    import org.hibernate.HibernateException; import org.hibernate.Session; import org.hibernate.cfg.Configuration; /** * Configures and provides access to Hibernate sessions, tied to the * current ...

    常用的HQL语句!!!!

    public Object doInHibernate(Session session) throws HibernateException, SQLException { return session.createQuery(hql).executeUpdate(); } }); ``` 3. **HQL单表查询**: 单表查询可以从一个表中获取...

    hibernate数据关联

    } catch (HibernateException e) { if (tx != null) tx.rollback(); e.printStackTrace(); } finally { session.close(); } } } ``` #### 四、常见问题解答 **问题1**: 如果将`user.hbm.xml`中的`cascade`...

    hibernate的事务核并发

    标题:“Hibernate的事务与并发控制” 描述:本文深入解析了Hibernate框架中事务管理和并发控制的核心概念及其实现机制,基于一份详尽的“hibernate详细解析.pdf”文档,覆盖了非托管环境、JTA环境下的事务处理以及...

    Hibernate复合主键

    import org.hibernate.HibernateException; import org.hibernate.Session; import org.hibernate.Transaction; public class HibernateTest extends TestCase { public void testSaveAndLoad() { Session ...

Global site tag (gtag.js) - Google Analytics