spirng和hibernate

創立Spring配置文件

spring-hibernate.xml 
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans 
http://www.springframework.org/schema/beans/spring-beans-2.0.xsd">
<bean id="myDataSource" class="org.apache.commons.dbcp.BasicDataSource" >
    <property name="driverClassName" value="oracle.jdbc.driver.OracleDriver"/>
    <property name="url" value="jdbc:oracle:thin:@localhost:1521:XE"/>
    <property name="username" value="root"/>
    <property name="password" value="root"/>
</bean>

?
</beans>

 上面bean定義了一個類型'org.apache.commons.dbcp.BasicDataSource'的data-source. 更重要的是, 它定義了各種訪問數據庫所需要的連接屬性。

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

<bean id="mySessionFactory" 
class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
    <property name="dataSource" ref="myDataSource"/>
    <property name="mappingResources">
        <list>
            <value>com/xxxx/audit/pojo/Activitylog.hbm.xml</value>
        </list>
    </property>
    <property name="hibernateProperties">
        <value>hibernate.dialect=org.hibernate.dialect.Oracle9Dialect</value>
    </property>
</bean>

 

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

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

<bean id="hibernateTemplate" 
class="org.springframework.orm.hibernate3.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 class

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

ActivitylogDao.java 
package javabeat.spring.hibernate;
import java.sql.SQLException;
import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.springframework.orm.hibernate3.HibernateCallback;
import org.springframework.orm.hibernate3.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() 方法。

    3.6) 客戶端測試程序

SpringHibernateTest.java 
package javabeat.spring.hibernate;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.xml.XmlBeanFactory;
import org.springframework.core.io.FileSystemResource;
import org.springframework.core.io.Resource;
import org.springframework.orm.hibernate3.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("123");
        activitylog.setName("ABC");
        activitylog.setTaskcode(“8000933120);
        activitylog.setTasktime(“2008 11 20 12:02:30 888888”);
        ActivitylogDao activitylogDao = (ActivitylogDao)factory.getBean(
            "activitylogDao");
        activitylogDao.saveOrUpdate(activitylog);        
        Activitylog actResult = activitylogDao.getActivitylog ("123");       
        System.out.println(actResult);
    }
}

 

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

    4)總結

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章