知识大全 当Spring遇到Hibernate的时候

Posted 数据库

篇首语:实践是知识的母亲,知识是生活的明灯。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 当Spring遇到Hibernate的时候相关的知识,希望对你有一定的参考价值。

当Spring遇到Hibernate的时候  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!

   ) 介绍

  最近我参与了北美一家银行的审计系统的后台软件设计和开发工作 除了使用Web Service以外 我们集成了Spring和Hibernate 通过Spring的HibernateTemplate实现了对数据库数据的存取 众所周知Hibernate是一种广泛应用的一种强大的数据持久层技术 另一方面Spring作为支持IOC的依赖注入框架 其优点是能够非常好地集成大多数主流技术 本文我们将讨论如何集成 Spring 和Hibernate

   ) Spring和Hibernate基础

  在我们实际进入集成这两个技术之前 让我们理解这种集成需求 大家都知道Hibernate是一种位于应用和数据库之间的强大的ORM 工具 它可使应用以独立平台的方式从各种数据库访问数据 对应用来说没有必要依赖于低级DBC 细节如管理连接 处理statements 和result sets 所有访问特定数据源的细节很容易在Xml文件中配置 另一个好处是Hibernate和J SE和J EE应用兼容得很好

  使用Hibernate 问题之一是使用Hibernate Framework访问数据库的客户应用必须依赖Hibernate APIs如Configuration SessionFactory and Session 这些个对象在应用代码中持续扩散 而且应用代码必须用手工维护和管理这些对象 但是在Spring的环境 业务对象通过IOC的帮助下是能够通过配置完成的 简单地说 一个对象状态能够从应用代码中分离 意思是现在使用Hibernate 对象作为Spring Beans是可能的 他们能够得到Spring提供的所有方便

   ) 集成Sample

  我们没有打算研究Spring包里集成的各种API 我们想通过实例源码来学习和理解这些APIs 下列部分包括了集成Spring Hiberante 的每个步骤并附有详细的解释

   ) 创立数据库

  下面的应用使用Oracle数据库 Oracle g的express版本可以从免费下载 安装后 先用管理员身份登录和创建用户schema username and password 再以用户身份登录后去SQL mand 或SQL Script运行以下SQL statement create table Activitylog(id varchar( ) name varchar( ) taskcode varchar( ) tasktime timestamp) 现在一个空表已创立

   ) ActivityLog类

  现在让我们创建叫做Activitylog POJO代码用于存储从Activitylog表取出的数据 此类的设计使表 Activitylog 的列名将被映射到Java类Activitylog适当类型的变量名 可使用ant工具或plug in产生 Activitylog类完整的代码列举如下

   package  xxx audit pojo;public class Activitylog     private String id;    private String name;    private String taskcode;    private Timestamp tasktime;    public Activitylog ()         public String getId()          return id;        public void setId(String id)        this id = id;        public String getName()        return name;        public void setName(String name)        this name = name;        public String getTaskcode()        return taskcode;           public void setTaskcode(String taskcode)        this taskcode = taskcode;        public Timestamp getTasktime()        return tasktime;        public void setTasktime(Timestamp tasktime)        this tasktime = tasktime;        public String toString()        return  Id =   + id +   Name =   + name +   Taskcode =               + taskcode +   Tasktime =   + tasktime;    

  注意toString() 方法重写是为了Activitylog 对象的显示

   ) 创建Hibernate Mapping 文件

  我们已经在数据库中创建了 Activitylog 表和一个在应用层相应的Java类 class 我们需要创建Hibernate Mapping文件去把 Activitylog 表映射到 Activitylog Java 类 Activitylog 表的列名映射到 Activitylog Java 类的变量 可使用ant工具或plug in产生 让我们看看Hibernate Mapping文件

   Activitylog hbm xml <?xml version= ?><!DOCTYPE hibernate mapping PUBLIC  //Hibernate/Hibernate Mapping DTD  //EN      mapping dtd ><hibernate mapping>    <class name= xxxx audit pojo activitylog  table=  activitylog  >    <id name= id  column= Id >        <generator class= assigned />    </id>    <property name= name >        <column name= Name />    </property>    <property name= taskcode >        <column name= Taskcode />    </property>    <property name= tasktime >        <column name= Tasktime />    </property></class></hibernate mapping>

  注意映射文件是一个Xml文件并且它的名字是Activitylog hbm xml 文件名中 hbm 代表它是Hibernate映射文件 class 标记定义了数据库表和Java类之间的映射 name 属性必须指向一个全路径的Java类名 反之表属性必须指向数据库表 接下来的标记定义了列名和对应java变量之间的映射 id 标记作为主键定义了一行的标识 property标记有一个属性叫 name 指向Java变量名 接下来的是它映射的数据库表的列名

   ) 创立Spring配置文件

  这部分处理配置各种Spring需要的信息 在Spring全部的业务对象在Xml文件中配置 配置的业务对象叫做 Spring Beans 这些Spring Beans可通过IOC维护 让我们定义一个data source如下

   spring hibernate xml <?xml version=  encoding= UTF ?><beans xmlns= xmlns:xsi= instance xsi:schemaLocation= ; beans xsd ><bean id= myDataSource  class= mons dbcp BasicDataSource  >    <property name= driverClassName  value= oracle jdbc driver OracleDriver />    <property name= url  value= jdbc:oracle:thin:@localhost: :XE />    <property name= username  value= root />    <property name= password  value= root /></bean>?</beans>

  上面bean定义了一个类型 mons dbcp BasicDataSource 的data source 更重要的是 它定义了各种访问数据库所需要的连接属性

  现在让我们定义第二个Spring Bean SessionFactory 如果你有Hibernate编程经验 你将实现SessionFactory Bean 负责去创建Session对象 通过Session对象处理 Transaction 和数据访问 现在同样的SessionFactory Bean必须用Spring的方式进行配置如下

   <bean id= mySessionFactory  class= springframework orm hibernate LocalSessionFactoryBean >    <property name= dataSource  ref= myDataSource />    <property name= mappingResources >        <list>            <value>/xxxx/audit/pojo/Activitylog hbm xml</value>        </list>    </property>    <property name= hibernateProperties >        <value>hibernate dialect= hibernate dialect Oracle Dialect</value>    </property></bean>

  当配置SessionFactory Bean时 我们已经给出两个强制信息 一个是data source 信息包含访问数据库的细节 第二个是一个映射文件的列表 他包含了数据库表和Java类之间的映射信息 我们在第 部分已经定义了他们 在 list 标志中应用

  第三个重要的Spring Bean是Hibernate Template 它提供了一个低级数据访问和操作的包装 精确地它包含以下方法 insert/delete/update/find数据库中的数据 对Hibernate Template的配置唯一的变量是SessionFactory Bean对象如下所示

   <bean id= hibernateTemplate  class= springframework orm hibernate HibernateTemplate >    <property name= sessionFactory >        <ref bean= mySessionFactory />    </property></bean>

  最后的Bean定义是Dao类 是客户化的类 虽然此类必须定义在应用级 它能够包含任意数量客户数据访问方法的封装 虽然我们知道它是与数据库交互的 Hibernate Template类 它将是一个Hibernate Template的理想引用

   <bean id= ActivitylogDao  class= javabeat spring hibernate ActivitylogDao >    <property name= hibernateTemplate >        <ref bean= hibernateTemplate />        </property></bean>

  注意一个引用指向 ActivitylogDao类 它是我们以前讨论过的

   )定义ActivitylogDao class

  如上所述 这个ActivitylogDao 类能够包含任意数量的方法供客户访问 这个类的设计有两种选择 第一种是此类能够直接依赖Hibernate Template 对象访问数据 它由IOC注入 第二种是它你呢个够利用Hibernate API做数据访问 此类声明如下

   ActivitylogDao java package javabeat spring hibernate;import java sql SQLException;import  hibernate HibernateException;import  hibernate Session;import  springframework orm hibernate HibernateCallback;import  springframework orm hibernate HibernateTemplate;public class ActivitylogDao     private HibernateTemplate hibernateTemplate;    public void setHibernateTemplate(HibernateTemplate hibernateTemplate)        this hibernateTemplate = hibernateTemplate;        public HibernateTemplate getHibernateTemplate()        return hibernateTemplate;        public Activitylog getActivitylog (final String id)                HibernateCallback callback = new HibernateCallback()             public Object doInHibernate(Session session)                 throws HibernateException SQLException                 return session load(Activitylog class  id);                    ;                return (Activitylog)hibernateTemplate execute(callback);        public void saveOrUpdate(final Activitylog activitylog)        HibernateCallback callback = new HibernateCallback()             public Object doInHibernate(Session session)                 throws HibernateException SQLException                 session saveOrUpdate(activitylog);                return null;                    ;                  hibernateTemplate execute(callback);    

  此类利用了Hibernate API (特别是Session对象) 用于数据访问 引导Spring访问 Hibernate API 我们把逻辑细化 利用Hibernate API 融入Spring知道的著名接口中的特别著名的方法 It happens to be the HibernateCallback 接口使用方法doInHibernate() 通过传送一个Hibernate Session 实例 ActivitylogDao类我们已经定义了两个方法 getActivitylog () and saveOrUpdate 使用Hibernate APIs 我们定义了HibernateCallback中的代码 doInHibernate() 方法和通知Spring 执行这些代码 传送接口引用HibernateTemplate execute() 方法

   ) 客户端测试程序

   SpringHibernateTest java package javabeat spring hibernate;import  springframework beans factory BeanFactory;import  springframework beans factory xml XmlBeanFactory;import re io FileSystemResource;import re io Resource;import  springframework orm hibernate LocalSessionFactoryBean;public class SpringHibernateTest     public static void main(String[] args)         Resource resource = new FileSystemResource( /spring hibernate xml );        BeanFactory factory = new XmlBeanFactory(resource);        Activitylog activitylog = new Activitylog ();        activitylog setId( );        activitylog setName( ABC );        activitylog setTaskcode( );        activitylog setTasktime(       : :   );        ActivitylogDao activitylogDao = (ActivitylogDao)factory getBean(             activitylogDao );        activitylogDao saveOrUpdate(activitylog);                Activitylog actResult = activitylogDao getActivitylog ( );               System out println(actResult);    

  最后 我们运行客户应用访问测试数据 过程像这样 当方法BeanFactory getBean( ActivitylogDao ) 被调用 Spring 找到ActivitylogDao Bean 的指针 它产生Hibernate Template 对象 然后初始化Hibernate Template对象 我们将看到一个Session Factory Bean对象被引用 然后当建立Session Factory Bean对象的时候 将得到data source 信息和数据库表和Java类

   )总结

cha138/Article/program/Java/ky/201311/28810

相关参考

知识大全 用struts+spring+hibernate组装web应用

  其实就算用Java建造一个不是很烦琐的web应用程序也不是件轻松的事情当为一个应用程序建造一个构架时有许多事情需要考虑从高层来说开发者需要考虑怎样建立用户接口(userinterfaces)?在哪

知识大全 Spring整合HIbernate

Spring整合HIbernate  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  Spring整

知识大全 Spring操作Hibernate更方便

Spring操作Hibernate更方便  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  软件系统

知识大全 Struts+Spring+Hibernate快速入门

Struts+Spring+Hibernate快速入门  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧

知识大全 Struts&Spring&Hibernate面试总结

Struts&Spring&Hibernate面试总结  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧

知识大全 Spring动态加载Hibernate映射文件

Spring动态加载Hibernate映射文件  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!&nb

知识大全 Struts 2, spring 2, hibernate

Struts2,spring2,hibernate  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 

知识大全 Spring+Hibernate的单元测试JUnit

Spring+Hibernate的单元测试JUnit  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!

知识大全 在Spring中配置Hibernate的事务

在Spring中配置Hibernate的事务  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  本文

知识大全 SPring管理Hibernate事务出现异常处理

SPring管理Hibernate事务出现异常处理  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!