熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> Java開源技術 >> 正文

當Spring遇到Hibernate的時候

2013-11-23 20:38:22  來源: Java開源技術 

  ) 介紹

  最近我參與了北美一家銀行的審計系統的後台軟件設計和開發工作除了使用Web Service以外我們集成了Spring和Hibernate通過Spring的HibernateTemplate實現了對數據庫數據的存取眾所周知Hibernate是一種廣泛應用的一種強大的數據持久層技術 另一方面Spring作為支持IOC的依賴注入框架 其優點是能夠非常好地集成大多數主流技術 本文我們將討論如何集成 Spring 和Hibernate

  ) Spring和Hibernate基礎

  在我們實際進入集成這兩個技術之前讓我們理解這種集成需求大家都知道Hibernate是一種位於應用和數據庫之間的強大的ORM 工具 它可使應用以獨立平台的方式從各種數據庫訪問數據對應用來說沒有必要依賴於低級DBC 細節如管理連接 處理statements 和result sets 所有訪問特定數據源的細節很容易在Xml文件中配置另一個好處是Hibernate和JSE和JEE應用兼容得很好

  使用Hibernate 問題之一是使用Hibernate Framework訪問數據庫的客戶應用必須依賴Hibernate APIs如Configuration SessionFactory and Session 這些個對象在應用代碼中持續擴散而且應用代碼必須用手工維護和管理這些對象但是在Spring的環境 業務對象通過IOC的幫助下是能夠通過配置完成的簡單地說一個對象狀態能夠從應用代碼中分離意思是現在使用Hibernate 對象作為Spring Beans是可能的他們能夠得到Spring提供的所有方便

  ) 集成Sample

  我們沒有打算研究Spring包裡集成的各種API我們想通過實例源碼來學習和理解這些APIs 下列部分包括了集成SpringHiberante 的每個步驟並附有詳細的解釋

  ) 創立數據庫

  下面的應用使用Oracle數據庫 Oracleg的express版本可以從免費下載安裝後 先用管理員身份登錄和創建用戶schemausername and password再以用戶身份登錄後去SQL command 或SQL Script運行以下SQL statement create table Activitylog(id varchar( name varchar( taskcode varchar( tasktime timestamp)現在一個空表已創立

  ) ActivityLog類

  現在讓我們創建叫做Activitylog POJO代碼用於存儲從Activitylog表取出的數據此類的設計使表Activitylog的列名將被映射到Java類Activitylog適當類型的變量名 可使用ant工具或plugin產生Activitylog類完整的代碼列舉如下

   package comxxxauditpojo;
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){
        thisid = id;
    }
    public String getName(){
        return name;
    }
    public void setName(String name){
        thisname = name;
    }
    public String getTaskcode(){
        return taskcode;
    }   
    public void setTaskcode(String taskcode){
        thistaskcode = taskcode;
    }
    public Timestamp getTasktime(){
        return tasktime;
    }
    public void setTasktime(Timestamp tasktime){
        thistasktime = 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工具或plugin產生讓我們看看Hibernate Mapping文件

   Activityloghbmxml 
<?xml version=?>
<!DOCTYPE hibernatemapping PUBLIC //Hibernate/Hibernate Mapping DTD //EN
    mappingdtd>
<hibernatemapping>
    <class name=comxxxxauditpojoactivitylog 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>
</hibernatemapping>

  注意映射文件是一個Xml文件並且它的名字是Activityloghbmxml 文件名中hbm 代表它是Hibernate映射文件 class 標記定義了數據庫表和Java類之間的映射 name 屬性必須指向一個全路徑的Java類名反之表屬性必須指向數據庫表接下來的標記定義了列名和對應java變量之間的映射id 標記作為主鍵定義了一行的標識property標記有一個屬性叫name 指向Java變量名 接下來的是它映射的數據庫表的列名

  ) 創立Spring配置文件

  這部分處理配置各種Spring需要的信息 在Spring全部的業務對象在Xml文件中配置配置的業務對象叫做 Spring Beans這些Spring Beans可通過IOC維護讓我們定義一個data source如下

   springhibernatexml 
<?xml version= encoding=UTF?>
<beans xmlns=
xmlns:xsi=instance
xsi:schemaLocation=;
beansxsd>
<bean id=myDataSource class=monsdbcpBasicDataSource >
    <property name=driverClassName value=oraclejdbcdriverOracleDriver/>
    <property name=url value=jdbc:oracle:thin:@localhost::XE/>
    <property name=username value=root/>
    <property name=password value=root/>
</bean>

?
</beans>

  上面bean定義了一個類型monsdbcpBasicDataSource的datasource 更重要的是 它定義了各種訪問數據庫所需要的連接屬性

  現在讓我們定義第二個Spring BeanSessionFactory如果你有Hibernate編程經驗 你將實現SessionFactory Bean 負責去創建Session對象通過Session對象處理 Transaction 和數據訪問 現在同樣的SessionFactory Bean必須用Spring的方式進行配置如下

   <bean id=mySessionFactory 
class=orgspringframeworkormhibernateLocalSessionFactoryBean>
    <property name=dataSource ref=myDataSource/>
    <property name=mappingResources>
        <list>
            <value>com/xxxx/audit/pojo/Activityloghbmxml</value>
        </list>
    </property>
    <property name=hibernateProperties>
        <value>hibernatedialect=orghibernatedialectOracleDialect</value>
    </property>
</bean>

  當配置SessionFactory Bean時我們已經給出兩個強制信息 一個是datasource 信息包含訪問數據庫的細節第二個是一個映射文件的列表他包含了數據庫表和Java類之間的映射信息我們在第部分已經定義了他們list標志中應用

  第三個重要的Spring Bean是Hibernate Template 它提供了一個低級數據訪問和操作的包裝精確地它包含以下方法insert/delete/update/find數據庫中的數據對Hibernate Template的配置唯一的變量是SessionFactory Bean對象如下所示

   <bean id=hibernateTemplate 
class=orgspringframeworkormhibernateHibernateTemplate>
    <property name=sessionFactory>
        <ref bean=mySessionFactory/>
    </property>
</bean>

  最後的Bean定義是Dao類是客戶化的類 雖然此類必須定義在應用級它能夠包含任意數量客戶數據訪問方法的封裝雖然我們知道它是與數據庫交互的 Hibernate Template類它將是一個Hibernate Template的理想引用

   <bean id=ActivitylogDao class=javabeatspringhibernateActivitylogDao>
    <property name=hibernateTemplate>
        <ref bean=hibernateTemplate/>    
    </property>
</bean>

  注意一個引用指向 ActivitylogDao類它是我們以前討論過的

  )定義ActivitylogDao class

  如上所述 這個ActivitylogDao 類能夠包含任意數量的方法供客戶訪問這個類的設計有兩種選擇第一種是此類能夠直接依賴Hibernate Template 對象訪問數據它由IOC注入 第二種是它你呢個夠利用Hibernate API做數據訪問此類聲明如下

   ActivitylogDaojava 
package javabeatspringhibernate;
import javasqlSQLException;
import orghibernateHibernateException;
import orghibernateSession;
import orgspringframeworkormhibernateHibernateCallback;
import orgspringframeworkormhibernateHibernateTemplate;
public class ActivitylogDao {
    private HibernateTemplate hibernateTemplate;
    public void setHibernateTemplate(HibernateTemplate hibernateTemplate){
        thishibernateTemplate = hibernateTemplate;
    }
    public HibernateTemplate getHibernateTemplate(){
        return hibernateTemplate;
    }

    public Activitylog getActivitylog (final String id){        
        HibernateCallback callback = new HibernateCallback() {
            public Object doInHibernate(Session session) 
                throws HibernateExceptionSQLException {
                return sessionload(Activitylogclass id);
            }
        };        
        return (Activitylog)hibernateTemplateexecute(callback);
    }

    public void saveOrUpdate(final Activitylog activitylog){
        HibernateCallback callback = new HibernateCallback() {
            public Object doInHibernate(Session session) 
                throws HibernateExceptionSQLException {
                sessionsaveOrUpdate(activitylog);
                return null;
            }
        };          
        hibernateTemplateexecute(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 執行這些代碼 傳送接口引用HibernateTemplateexecute() 方法

  ) 客戶端測試程序

   SpringHibernateTestjava 
package javabeatspringhibernate;
import orgspringframeworkbeansfactoryBeanFactory;
import orgspringframeworkbeansfactoryxmlXmlBeanFactory;
import orgreioFileSystemResource;
import orgreioResource;
import orgspringframeworkormhibernateLocalSessionFactoryBean;

public class SpringHibernateTest {
    public static void main(String[] args) {
        Resource resource = new FileSystemResource(/springhibernatexml);
        BeanFactory factory = new XmlBeanFactory(resource);
        Activitylog activitylog = new Activitylog ();
        activitylogsetId();
        activitylogsetName(ABC);
        activitylogsetTaskcode();
        activitylogsetTasktime(   :: );
        ActivitylogDao activitylogDao = (ActivitylogDao)factorygetBean(
            activitylogDao);
        activitylogDaosaveOrUpdate(activitylog);        
        Activitylog actResult = activitylogDaogetActivitylog ();       
        Systemoutprintln(actResult);
    }
}

  最後 我們運行客戶應用訪問測試數據過程像這樣 當方法BeanFactorygetBean(ActivitylogDao) 被調用 Spring 找到ActivitylogDao Bean 的指針 它產生Hibernate Template 對象 然後初始化Hibernate Template對象 我們將看到一個Session Factory Bean對象被引用然後當建立Session Factory Bean對象的時候 將得到datasource 信息和數據庫表和Java類

  )總結

  本文討論了Spring 和Hibernate的集成 既討論了需求也討論了它帶來的好處 通過一個詳細的實例一步步清晰地演示了集成工作


From:http://tw.wingwit.com/Article/program/Java/ky/201311/28810.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.