下面介紹一下hibernate與spring的集成,這兩個(gè)框架的集成關(guān)鍵在于applicationContext.xml文件的配置,其實(shí)很簡(jiǎn)單的,但需要注意的是,導(dǎo)入包時(shí)一定選擇導(dǎo)入到webroot/web-inf/lib目錄中,而且hibernate一般要在spring之前導(dǎo)入,因?yàn)榧蓵r(shí)要用到sessionFactory類,
一、初始化工作:新建一個(gè)項(xiàng)目,如(ssh),在此項(xiàng)目中導(dǎo)入對(duì)hibernate的支持,新建一個(gè)表sstest表,有字段id,username,password,id為主健和自動(dòng)增1
二、對(duì)新建的數(shù)據(jù)表進(jìn)行hibernate進(jìn)行映射,打開(kāi)myhibernate視圖,右擊你sstest表->選hibernate revers engineering選項(xiàng),然后把Sstest.hbm.xml文件映射到hibernateDao包中,同時(shí)選中工具 hibernate mapping file...,  java data object.....,  java data access object dao...選項(xiàng),先中這幾個(gè)文件就可以產(chǎn)生下列幾個(gè).java文件:BaseHibernateDAO. ,HibernateSessionFactory ,IBaseHibernateDAO, Sstest,SstestDAO,最后你對(duì)你的代碼進(jìn)行測(cè)試,測(cè)試成功,進(jìn)行下一步
三、在項(xiàng)目中導(dǎo)入對(duì)spring的支持,在導(dǎo)入項(xiàng)目后不但要自動(dòng)產(chǎn)生applicationContext.xml,而且在這個(gè)文件里會(huì)出現(xiàn)下面的內(nèi)容:
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
  <property name="configLocation" value="classpath:hibernate.cfg.xml">   
  </property>
 </bean>
這就是為什么要先要導(dǎo)入hibernate的原因
四、若你對(duì)spring的ioc比較熟,你可以直接進(jìn)入下一步,如果不是很了解,那么你可以寫(xiě)一個(gè)比較簡(jiǎn)單的例子測(cè)試一下看是否成功,必竟框架和在一起,所以小心點(diǎn)好,不然在以后出了有問(wèn)題不好找
五、進(jìn)入myeclipse hibernate視圖下,在新的包(如springDao)中重新對(duì)sstest表進(jìn)行映射,這次映射要注意的就是:打開(kāi)hibernate reverse engineering對(duì)話框中復(fù)選按鈕java data access object(dao)(hibernate 3 only)下,dao type 不是選basic dao選項(xiàng),而是選spring dao選項(xiàng),當(dāng)你映射成功后,就會(huì)出現(xiàn)Sstest.java, SstestDAO.java, Sstest.hbm.xml幾個(gè)文件,你可以寫(xiě)一個(gè)類進(jìn)行測(cè)試,如:
springdaotest.java

package org.test;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import springDao.Sstest;
import springDao.SstestDAO;

public class SpringDaoTest {
 public static void main(String a[]){
  ApplicationContext cont = new ClassPathXmlApplicationContext("applicationContext.xml");
  SstestDAO  s = (SstestDAO) cont.getBean("SstestDAO");
   SstestDAO  s = (SstestDAO) cont.getBean("SstestDAOProxy");
  Sstest st = new Sstest();
  st.setUsername("spring");
  st.setPassword("spring");
  s.save(st);   
 } 
}
六、由于映射了兩次,所以你要在hibernate.cfg.xml文件中,把原來(lái)映射的文件注解掉:
<mapping resource="hibernateDao/Sstest.hbm.xml" />
因?yàn)楝F(xiàn)在已有一行這樣的代碼:
<mapping resource="springDao/Sstest.hbm.xml" />
七、實(shí)現(xiàn)hibernate spring 代理,加上下面的代碼即可:
<bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
  <property name="sessionFactory">
   <ref local="sessionFactory"/>
  </property>
 </bean>
 <bean id="SstestDAOProxy" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
  <property name="proxyTargetClass">
   <value>true</value>
  </property>
  <property name="transactionManager">
   <ref bean="transactionManager"/>
  </property>
  <property name="target">
   <ref local="SstestDAO"/>
  </property>
  <property name="transactionAttributes">
   <props>
    <prop key="*">PROPAGATION_REQUIRED</prop>
   </props>
  </property>
 </bean>
在進(jìn)行測(cè)試,測(cè)試時(shí),還是用原來(lái)的類,只需把SstestDAO  s = (SstestDAO) cont.getBean("SstestDAO");變成
SstestDAO  s = (SstestDAO) cont.getBean("SstestDAOProxy");這次的bean是用的代碼類實(shí)現(xiàn)
下面是完整的代碼:
在這個(gè)實(shí)例中hibernate包中的文件BaseHibernateDAO. ,HibernateSessionFactory ,IBaseHibernateDAO, Sstest,SstestDAO, Sstest.hbm.xml ,和在一個(gè)簡(jiǎn)單的struts,hibernate例子以及struts,hibernate集成中的文件是一樣的,代碼一樣,下面是一些其它代碼:
applicationContext.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="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
  <property name="configLocation" value="classpath:hibernate.cfg.xml">   
  </property>
 </bean>

 <!-- spring dao -->
 <bean id="SstestDAO" class="springDao.SstestDAO">
  <property name="sessionFactory">
   <ref bean="sessionFactory"/>
  </property>
 </bean>
 <!-- hibernate 3 事務(wù)代理 -->
 <bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
  <property name="sessionFactory">
   <ref local="sessionFactory"/>
  </property>
 </bean>
 <bean id="SstestDAOProxy" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
  <property name="proxyTargetClass">
   <value>true</value>
  </property>
  <property name="transactionManager">
   <ref bean="transactionManager"/>
  </property>
  <property name="target">
   <ref local="SstestDAO"/>
  </property>
  <property name="transactionAttributes">
   <props>
    <prop key="*">PROPAGATION_REQUIRED</prop>
   </props>
  </property>
 </bean>
</beans> 
測(cè)試類:SpringDaoTest.java

package org.test;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import springDao.Sstest;
import springDao.SstestDAO;

public class SpringDaoTest {
 public static void main(String a[]){
  ApplicationContext cont = new ClassPathXmlApplicationContext("applicationContext.xml");
  //SstestDAO  s = (SstestDAO) cont.getBean("SstestDAO");
  //代理類
  SstestDAO  s = (SstestDAO) cont.getBean("SstestDAOProxy");
  Sstest st = new Sstest();
  st.setUsername("spring");
  st.setPassword("spring");
  s.save(st);   
 } 

Sstest.hbm.xml
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!--
    Mapping file autogenerated by MyEclipse Persistence Tools
-->
<hibernate-mapping>
    <class name="springDao.Sstest" table="sstest" schema="dbo" catalog="manager">
        <id name="id" type="java.lang.Integer">
            <column name="id" />
            <generator class="increment" />
        </id>
        <property name="username" type="java.lang.String">
            <column name="username" length="10" />
        </property>
        <property name="password" type="java.lang.String">
            <column name="password" length="20" />
        </property>
    </class>
</hibernate-mapping>
SstestDAO.java

package springDao;

import java.util.List;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.hibernate.LockMode;
import org.springframework.context.ApplicationContext;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;

public class SstestDAO extends HibernateDaoSupport {
 private static final Log log = LogFactory.getLog(SstestDAO.class);
 // property constants
 public static final String USERNAME = "username";
 public static final String PASSWORD = "password";

 protected void initDao() {
  // do nothing
 }

 public void save(Sstest transientInstance) {
  log.debug("saving Sstest instance");
  System.out.println("Ok");
  try {
   getHibernateTemplate().save(transientInstance);
   log.debug("save successful");
   System.out.print("save Ok");
  } catch (RuntimeException re) {
   log.error("save failed", re);
   throw re;
  }
 }

 public void delete(Sstest persistentInstance) {
  log.debug("deleting Sstest instance");
  try {
   getHibernateTemplate().delete(persistentInstance);
   log.debug("delete successful");
  } catch (RuntimeException re) {
   log.error("delete failed", re);
   throw re;
  }
 }

 public Sstest findById(java.lang.Integer id) {
  log.debug("getting Sstest instance with id: " + id);
  try {
   Sstest instance = (Sstest) getHibernateTemplate().get(
     "springDao.Sstest", id);
   return instance;
  } catch (RuntimeException re) {
   log.error("get failed", re);
   throw re;
  }
 }

 public List findByExample(Sstest instance) {
  log.debug("finding Sstest instance by example");
  try {
   List results = getHibernateTemplate().findByExample(instance);
   log.debug("find by example successful, result size: "
     + results.size());
   return results;
  } catch (RuntimeException re) {
   log.error("find by example failed", re);
   throw re;
  }
 }

 public List findByProperty(String propertyName, Object value) {
  log.debug("finding Sstest instance with property: " + propertyName
    + ", value: " + value);
  try {
   String queryString = "from Sstest as model where model."
     + propertyName + "= ?";
   return getHibernateTemplate().find(queryString, value);
  } catch (RuntimeException re) {
   log.error("find by property name failed", re);
   throw re;
  }
 }

 public List findByUsername(Object username) {
  return findByProperty(USERNAME, username);
 }

 public List findByPassword(Object password) {
  return findByProperty(PASSWORD, password);
 }

 public List findAll() {
  log.debug("finding all Sstest instances");
  try {
   String queryString = "from Sstest";
   return getHibernateTemplate().find(queryString);
  } catch (RuntimeException re) {
   log.error("find all failed", re);
   throw re;
  }
 }

 public Sstest merge(Sstest detachedInstance) {
  log.debug("merging Sstest instance");
  try {
   Sstest result = (Sstest) getHibernateTemplate().merge(
     detachedInstance);
   log.debug("merge successful");
   return result;
  } catch (RuntimeException re) {
   log.error("merge failed", re);
   throw re;
  }
 }

 public void attachDirty(Sstest instance) {
  log.debug("attaching dirty Sstest instance");
  try {
   getHibernateTemplate().saveOrUpdate(instance);
   log.debug("attach successful");
  } catch (RuntimeException re) {
   log.error("attach failed", re);
   throw re;
  }
 }

 public void attachClean(Sstest instance) {
  log.debug("attaching clean Sstest instance");
  try {
   getHibernateTemplate().lock(instance, LockMode.NONE);
   log.debug("attach successful");
  } catch (RuntimeException re) {
   log.error("attach failed", re);
   throw re;
  }
 }

 public static SstestDAO getFromApplicationContext(ApplicationContext ctx) {
  return (SstestDAO) ctx.getBean("SstestDAO");
 }
}

Sstest.java

package springDao;

public class Sstest implements java.io.Serializable {

 // Fields

 private Integer id;
 private String username;
 private String password;

 // Constructors

 /** default constructor */
 public Sstest() {
 }

 /** full constructor */
 public Sstest(String username, String password) {
  this.username = username;
  this.password = password;
 }

 // Property accessors

 public Integer getId() {
  return this.id;
 }

 public void setId(Integer id) {
  this.id = id;
 }

 public String getUsername() {
  return this.username;
 }

 public void setUsername(String username) {
  this.username = username;
 }

 public String getPassword() {
  return this.password;
 }

 public void setPassword(String password) {
  this.password = password;
 }

}

hibernate.cfg.xml

<?xml version='1.0' encoding='UTF-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
          "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
          "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">

<!-- Generated by MyEclipse Hibernate Tools.                   -->
<hibernate-configuration>

 <session-factory>
  <property name="connection.username">sa</property>
  <property name="connection.url">
   jdbc:microsoft:sqlserver://127.0.0.1:1433;DatabaseName=manager
  </property>
  <property name="dialect">
   org.hibernate.dialect.SQLServerDialect
  </property>
  <property name="myeclipse.connection.profile">
   com.microsoft.jdbc.sqlserver.SQLServerDriver
  </property>
  <property name="connection.password">wq</property>
  <property name="connection.driver_class">
   com.microsoft.jdbc.sqlserver.SQLServerDriver
  </property>
  <!-- <mapping resource="hibernateDao/Sstest.hbm.xml" /> -->
  <!-- 使用springdao -->
  <mapping resource="springDao/Sstest.hbm.xml" />

 </session-factory>

</hibernate-configuration>