Dashboard > OpenSource Project > ... > Spring > 入門 35 - Hibernate SessionFactory注入
OpenSource Project Log In   View a printable version of the current page.
入門 35 - Hibernate SessionFactory注入
Added by cheetah, last edited by cheetah on Apr 03, 2005
Labels: 
(None)

  這篇文章假設您知道如何撰寫一個基本的Hibernate程式,Hibernate是個O/R Mapping工具 ,您也可以在我寫的另一個有關Hibernate系列文章中瞭解它。

  Spring可以與Hibernate結合使用,Hibernate的連結、事務管理等是由SessionFactory開始的,而SessionFactory底層的DataSource可以使用Spring的IoC注入,之後您再注入SessionFactory至相依的物件之中。

  先來寫個簡單的Bean,它保留SessionFactory介面,以接受Spring容器注入的SessionFactory實例:

 代碼:

DataBean.java
package onlyfun.caterpillar; 

import net.sf.hibernate.*; 

public class DataBean { 
    private SessionFactory sessionFactory; 
    
    public void setSessionFactory(SessionFactory sessionFactory) { 
        this.sessionFactory = sessionFactory; 
    } 
    
    public void testDataSource() { 
        try { 
            Session session = sessionFactory.openSession(); 
            if(session != null) 
                System.out.println("test ok!"); 
        } 
        catch (Exception e) { 
            e.printStackTrace(); 
        } 
    } 
}

  在這個Bean中我作了個簡單的測試,從SessionFactory中試著取得Session,主要的目的只在於測試與Hibernate的測試是否成功而已。

  來看看Bean定義檔,我們必須為Hibernate的SessionFactory準備DataSource,這邊以簡單的org.springframework.jdbc.datasource.DriverManagerDataSource來作作單機測試,DataSource注入org.springframework.orm.hibernate.LocalSessionFactoryBean,之後再注入我們的DataBean中:

 代碼:

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE beans PUBLIC "-//SPRING/DTD BEAN/EN" "http://www.springframework.org/dtd/spring-beans.dtd"> 
<beans> 
    <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> 
        <property name="driverClassName"> 
            <value>com.mysql.jdbc.Driver</value> 
        </property> 
        <property name="url"> 
            <value>jdbc:mysql://localhost:3306/HibernateTest</value> 
        </property> 
        <property name="username"> 
            <value>caterpillar</value> 
        </property> 
        <property name="password"> 
            <value>123456</value> 
        </property> 
    </bean> 
    
    <bean id="sessionFactory" class="org.springframework.orm.hibernate.LocalSessionFactoryBean" destroy-method="close"> 
        <property name="dataSource"> 
            <ref bean="dataSource"/> 
        </property> 
        <property name="mappingResources"> 
            <list> 
                <value>User.hbm.xml</value> 
            </list> 
        </property> 
        <property name="hibernateProperties"> 
            <props> 
                <prop key="hibernate.dialect"> 
                    net.sf.hibernate.dialect.MySQLDialect 
                </prop> 
            </props> 
        </property> 
    </bean> 


    <bean id="dataBean" class="onlyfun.caterpillar.DataBean"> 
        <property name="sessionFactory"> 
            <ref bean="sessionFactory"/> 
        </property> 
    </bean> 
</beans>

  Hibernate的物件與關聯表格映射文件,我們指定於mappingResources中,至於Hibernate本身的設定檔,您可以使用configLocation來指定hibernate.cfg.xml的位置,而這邊使用hibernateProperties在Spring的Bean定義檔中直接指定,Spring整合了這個部份,您可以由此減少對xml組態檔的管理。

  接下來是我們的User.java與User.hbm.xml:

 代碼:

User.java
package onlyfun.caterpillar; 

public class User { 
    private String id; 
    private String name; 
    private char sex; 
    private int age; 

    public int getAge() { 
        return age; 
    } 

    public String getId() { 
        return id; 
    } 

    public String getName() { 
        return name; 
    } 

    public char getSex() { 
        return sex; 
    } 

    public void setAge(int i) { 
        age = i; 
    } 

    public void setId(String string) { 
        id = string; 
    } 

    public void setName(String string) { 
        name = string; 
    } 

    public void setSex(char c) { 
        sex = c; 
    } 
}

  根據設定,您要在資料庫中新增HibernateTest與建立相應的表格,之後就可以試著運行測試程式了,我們使用下面的程式片段來進行測試:

 代碼:

BeanDefinitionRegistry reg = new DefaultListableBeanFactory(); 
XmlBeanDefinitionReader reader = new XmlBeanDefinitionReader(reg); 
        
reader.loadBeanDefinitions(new ClassPathResource("bean.xml"));; 
        
BeanFactory bf = (BeanFactory) reg; 
DataBean dataBean = (DataBean) bf.getBean("dataBean"); 
dataBean.testDataSource();

  為了要能運行測試程式,記得也要將spring-orm.jar加入至CLASSPATH(假如您加入的是spring.jar則不用,當中即包含),當然還有Hibernate相關的jar也要一併加入。

  與使用DataSourceUtils輔助類相似的道理,在取得Session時,您可以使用SessionFactoryUtils,例如:

 代碼:

Session session = SessionFactoryUtils.getSession(getSessionFactory(), false);

  方法中的"false""""""Session存在,否則SessionFactoryUtils會創建一個新的Session。

  關閉session時,可以使用以下:

 代碼:

SessionFactoryUtils.closeSessionIfNecessary(session, sessionFactory);

Site powered by a free Open Source Project / Non-profit License (more) of Confluence - the Enterprise wiki.
Learn more or evaluate Confluence for your organisation.
Powered by Atlassian Confluence, the Enterprise Wiki. (Version: 2.1.5a Build:#411 Mar 16, 2006) - Bug/feature request - Contact Administrators