Dao层(hibernate实现)的异常是在Dao层类内处理还是抛到上一层(Service业务层)
如果抛出的话是抛出运行时异常还是非运行时异常
我知道怎么写都行,但我想更贴近实际开发中的情况,请有经验的朋友指点一下
问题补充:
谢谢大家
不过还有一点我很想弄明白,就是Dao的异常是不是throws给Service,那Service层的异常是直接在方法内用try...catch处理还是再throws给Action呢
问题补充:
嗯,大概有数了,我在事务控制上是用Spring声明式事务统一管理的。
现在的异常是Dao层的,比如hibernateTemplate里各种方法抛出的DataAccessException,我自定义了一个异常继承自Exception,然后DAO层的接口方法throws这个自定义的异常
问题补充:
可是不是应该抛出非运行时异常比较好吗
Exception:表示可恢复的例外,这是可捕捉到的。
Java提供了两类主要的异常:runtime exception和checked exception。checked 异常也就是我们经常遇到的IO异常,以及SQL异常都是这种异常。对于这种异常,JAVA编译器强制要求我们必需对出现的这些异常进行catch。所以,面对这种异常不管我们是否愿意,只能自己去写一大堆catch块去处理可能的异常。
但是另外一种异常:runtime exception,也称运行时异常,我们可以不处理。当出现这样的异常时,总是由虚拟机接管。比如:我们从来没有人去处理过NullPointerException异常,它就是运行时异常,并且这种异常还是最常见的异常之一。
出现运行时异常后,系统会把异常一直往上层抛,一直遇到处理代码。如果没有处理块,到最上层,如果是多线程就由Thread.run()抛出,如果是单线程就被main()抛出。抛出之后,如果是线程,这个线程也就退出了。如果是主程序抛出的异常,那么这整个程序也就退出了。运行时异常是Exception的子类,也有一般异常的特点,是可以被Catch块处理的。只不过往往我们不对他处理罢了。也就是说,你如果不对运行时异常进行处理,那么出现运行时异常之后,要么是线程中止,要么是主程序终止。
如果不想终止,则必须扑捉所有的运行时异常,决不让这个处理线程退出。队列里面出现异常数据了,正常的处理应该是把异常数据舍弃,然后记录日志。不应该由于异常数据而影响下面对正常数据的处理。在这个场景这样处理可能是一个比较好的应用,但并不代表在所有的场景你都应该如此。如果在其它场景,遇到了一些错误,如果退出程序比较好,这时你就可以不太理会运行时异常,或者是通过对异常的处理显式的控制程序退出。
没什么好不好的,checked exception一般是程序中出的错,因此总是要抛出,并被处理的。而runtime exception在上面说过,通常由JVM接管的,spring就认为这个异常很严重,非要处理,所以要回滚。而其它的异常一般不主动回滚,由程序员来决定。当然,偷懒的作法就是直接抛出runtime exception,那spring就得处理了。
其实常见异常spring都处理好了.
一般都是抛出非运行时异常,
lovewhzlq (CTO) 2009-10-19
由于Spring中一般配置都是对运行时异常进行回滚,非运行时异常不回滚, 如果有回滚操作时,偶一般将应用的异常继承为运行时异常(怕麻烦),不然就继承非运行时异常,再在spring中配置为异常发生时回滚。
当然如果没有回滚需求的话,那就抛出checked exception好了,(hibernate就这样干的,逻辑性好)
蔡华江 (架构师) 2009-10-19
Service层的异常当然是不能自己处理,因为service层是业务逻辑层,不是应用层,不应该处理掉异常,应该由应用层也就是action部分来处理
throws给Action处理
lovewhzlq (CTO) 2009-10-19
当然可以try..catch..进行处理,这就随程序员的心情了
不过在spring中是可以对service的事务和异常进行统一处理的,就在前面提过,默认情况下,如果spring发现service抛出runtime exception,就回将回滚事务。
当然如果没什么事务控制的情况下,就是继续往上抛了,看action能不有处理,
如果action不能处理,就会输出日志,而页面就会出现找不到页面错误了
蔡华江 (架构师) 2009-10-19
没这必要,DataAccessException就是spring封装的一个RuntimeException,直接抛出就行了
蔡华江 (架构师) 2009-10-19
一般都是抛出非运行时异常的,
lovewhzlq (CTO) 2009-10-19
最好是一层一层往外抛,到了Action层,自己就写一个异常处理类,处理掉这个异常,并以友好的页面,呈现给前台,让访问者知道发了什么事。
sunlightcs (架构师) 2009-10-21
分享到:
相关推荐
在简单的情况下,Service层可能直接调用DAO层的方法,但其主要目的是提供更高层次的抽象,处理业务规则,进行异常处理,并与其他服务或系统进行交互。 在分层架构中,Service层和DAO层的解耦是非常重要的。Spring...
Dao层是应用与数据库之间的一层抽象,它封装了对数据库的所有操作,使得业务逻辑层可以专注于业务处理,而不必关心具体的SQL语句或者数据库连接管理。在Hibernate中,Dao层通常包含了一些对Hibernate Session的操作...
标题和描述中提到的"action层,dao层,service层,entity层"是这种分层架构的典型组成部分,下面将详细解释每一层的功能和它们之间的交互。 1. **Action层(控制层)**: 这一层主要负责接收用户的请求,进行业务...
标题中的“hibernate4 通用dao,service”指的是在Java开发中使用Hibernate框架实现的通用数据访问对象(DAO)和业务服务层(Service)。Hibernate是一个流行的对象关系映射(ORM)工具,它允许开发者使用面向对象的...
2. **分层设计**:Spring框架支持分层的设计模式,这意味着不同的业务功能可以被封装在不同的层中,例如Web层负责处理用户界面,Service层处理业务逻辑,DAO层处理数据访问。这样的设计有助于保持代码的清晰度,并...
在Java Web开发中,"jsp、servlet进行增删改查,dao层和service层分开"是一种常见的设计模式,它遵循了MVC(Model-View-Controller)架构,旨在提高代码的可维护性和可扩展性。以下是这个模式的详细解释: 1. **...
DAO(Data Access Object)是一种设计模式,它提供了一种与数据库交互的抽象层,使得业务逻辑层与数据访问层解耦。在用户登录时,DAO负责与数据库进行交互,比如执行SQL查询来验证用户名和密码。通过DAO,我们可以...
在IT行业中,DAO(Data Access Object)层是软件设计模式中的一个重要组成部分,它主要用于数据库操作,隔离了业务逻辑层与数据存储层之间的交互。在这个"简单DAO层示例"中,我们将探讨DAO的设计原则、实现方式以及...
在Java开发中,HibernateDao 通常作为一个独立的层,位于业务逻辑层(Service Layer)与持久化层(Persistence Layer)之间,用来封装对数据库的一系列CRUD(创建、读取、更新、删除)操作。 在JUMPER小组的工作...
在给定的标题“javaSE-day11-day12--主要实现了购物系统的dao层和service层”中,我们可以看到开发者在这两天的学习中重点集中在了系统的核心部分——数据访问对象(DAO)层和服务(Service)层的实现。 **数据访问...
然后,我们可以为每种实体类创建一个继承自`GenericDao`的实现类,如`UserDaoImpl`,并在Spring配置文件中声明并注入到Service层。这样,Service层就可以通过调用`UserDaoImpl`的方法,完成对用户表的操作,而无需...
本主题聚焦于"40-Hibernate数据关联实现〖MVSN〗_Struts + DAO + Hibernate(3)",这是一个关于如何利用Hibernate框架在Struts和DAO模式基础上实现数据关联的教程。以下是对这个主题的详细讲解: 首先,让我们理解...
此外,还可以了解到如何在Tomcat服务器上部署和运行一个基于Hibernate的Java EE应用。对于初学者来说,这是一个很好的实践平台,而对于有经验的开发者,这个源代码可以作为一个快速启动新项目的基础。
在Web应用程序的开发中,DAO(Data Access Object)层是一个至关重要的部分,它负责与数据库进行交互,隔离业务逻辑和数据存储的细节。本篇文章将深入探讨DAO层的设计与实现经验,结合源码分析和实用工具,以提高...
- Service层:DAO层之上,负责业务逻辑,调用多个DAO完成复杂的业务处理。 - Factory模式:创建SessionFactory实例,避免硬编码配置。 - Singleton模式:控制SessionFactory的实例只有一个,提高性能和资源利用率。 ...
标题中的“hibernate_10增删改查DAO”暗示了本次讨论...这包括了如何创建和配置Hibernate项目,定义实体类,实现DAO接口,以及在业务逻辑层进行事务管理。这些知识对于理解和实践Java Web开发中的数据持久化至关重要。
DAO层应捕获并处理可能抛出的数据库相关异常,如`SQLException`,然后将其转换为业务层能理解的异常,如自定义的`DataAccessException`。 6. **查询优化** 对于复杂的查询,DAO层可以利用预编译的SQL...
5. **Service**:服务层是业务逻辑的承载者,它调用DAO进行数据操作,处理业务流程,对外提供服务接口。 6. **接口对接文档**:这是系统间通信的重要文档,清晰地列出各个API接口的请求方式、URL、参数、返回值等...
在Java应用程序开发中,尤其是使用Hibernate作为持久层框架时,DAO层是至关重要的,它封装了数据库操作,使业务逻辑与数据访问分离,提高代码的可维护性和可测试性。 Hibernate是一款流行的Java ORM(对象关系映射...
在Java Web开发中,S2SH(Struts2 + Spring + Hibernate)是一个常见的技术栈,它结合了MVC框架Struts2、依赖注入容器Spring以及持久层框架Hibernate,以实现高效且灵活的Web应用开发。在这个基于Annotation并对DAO...