這篇文章假設您知道如何撰寫一個基本的Hibernate程式,Hibernate是個O/R Mapping工具 ,您也可以在我寫的另一個有關Hibernate系列文章中瞭解它。
Spring可以與Hibernate結合使用,Hibernate的連結、事務管理等是由SessionFactory開始的,而SessionFactory底層的DataSource可以使用Spring的IoC注入,之後您再注入SessionFactory至相依的物件之中。
先來寫個簡單的Bean,它保留SessionFactory介面,以接受Spring容器注入的SessionFactory實例:
代碼:
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 "- "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: </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:
代碼:
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);