JDBC的异常转换器
传统的JDBC API在发生几乎所有的数据操作问题都抛出相同的SQLException,它将异常的细节性信息封装在异常属性中,所以如果希望了解异常的具体原因,你必须分析异常对象的信息。
SQLException拥有两个代表异常具体原因的属性:错误码和SQL状态码,前者是数据库相关的,可通过getErrorCode()返回,其值的类型是int;而后者是一个标准的错误代码,可通过getSQLState()返回,是一个String类型的值,由5字符组成。
Spring根据错误码和SQL状态码信息将SQLExeption翻译成Spring DAO的异常体系。在org.springframework.jdbc.support包中定义了SQLExceptionTranslator接口,该接口的两个实现类SQLErrorCodeSQLExceptionTranslator和SQLStateSQLExceptionTranslator分别负责处理SQLException中错误代码和SQL状态码的翻译工作。将SQLException翻译成Spring DAO异常体系的工作是比较艰辛的,但Spring框架替我们完成这项艰巨的工作并保证转换的正确性,我们有充分的理由依赖这个转换的正确性。
其它持久技术的异常转换器
由于各种框架级的持久化技术都拥有一个语义明确的异常体系,所以将这些异常转换为Spring DAO的体系相对轻松一些。下面,我们将对不同持久化技术的异常转换器进行学习。
由于Hibernate 3.0版本和低版本不兼容,Spring分别为这两个版本分别提供了支持(这也可以看出Hibernate在Spring中所享受的特殊礼遇)。在org.springframework.orm包中,分别为Spring所支持的ORM持久化技术定义了一个子包,在这些子包中提供相应ORM技术的整合类。Spring为各个ORM持久化技术所提供的异常转换器在表 2中说明:
表 2 各ORM持久化技术异常转换器
|
ORM持久化技术
|
异常转换器
|
|
Hibernate
|
org.springframework.orm.hibernate.SessionFactoryUtils
|
|
Hibernate 3.0
|
org.springframework.orm.hibernate3.SessionFactoryUtils
|
|
JPA
|
org.springframework.orm.jpa.EntityManagerFactoryUtils
|
|
JDO
|
org.springframework.orm.jdo.PersistenceManagerFactoryUtils
|
|
TopLink
|
org.springframework.orm.toplink.SessionFactoryUtils
|