在项目中集成hibernate遇到的问题(4)

来源:互联网 发布:r语言编程艺术下载。 编辑:程序博客网 时间:2024/05/17 23:38

在项目中集成hibernate时,运行Project后提示:

Invocation of init method failed; nested exception is java.lang.IllegalArgumentException: 'sessionFactory' or 'hibernateTemplate' is required

在applicationContext.xml配置如下:

[html] view plaincopyprint?
  1. <?xmlversion="1.0"encoding="UTF-8"?> 
  2. <beans 
  3.     xmlns="http://www.springframework.org/schema/beans" 
  4.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
  5.     xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd"> 
  6.  
  7.     <importresource="applicatonDBContext.xml"/> 
  8.      
  9.      
  10.     <bean id="userDao"class="com.hnyd.demo.hibernate.jdbc.dao.impl.UserDao">      
  11.     </bean> 
  12. </beans> 

applicatonDBContext.xml配置如下:

[html] view plaincopyprint?
  1. <?xmlversion="1.0"encoding="UTF-8"?> 
  2. <beans xmlns="http://www.springframework.org/schema/beans" 
  3.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:jee="http://www.springframework.org/schema/jee" 
  4.     xmlns:tx="http://www.springframework.org/schema/tx"xmlns:jaxws="http://cxf.apache.org/jaxws" 
  5.     xmlns:context="http://www.springframework.org/schema/context" 
  6.     xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-2.5.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd" 
  7.     default-lazy-init="false"> 
  8.      
  9.     <beanid="SystemDataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">    
  10.         <propertyname="driverClass"                value="${db.driver}"/> 
  11.         <propertyname="jdbcUrl"                    value="${db.url}"/> 
  12.         <propertyname="user"                       value="${db.username}"/> 
  13.         <propertyname="password"                   value="${db.password}"/> 
  14.         <propertyname="minPoolSize"                value="10"/> 
  15.         <propertyname="maxPoolSize"                value="20"/> 
  16.         <propertyname="initialPoolSize"            value="2"/> 
  17.         <propertyname="maxIdleTime"                value="1800"/> 
  18.         <propertyname="acquireIncrement"           value="1"/> 
  19.         <propertyname="maxStatements"              value="0"/> 
  20.         <propertyname="idleConnectionTestPeriod"   value="60"/> 
  21.         <propertyname="acquireRetryAttempts"       value="30"/> 
  22.         <propertyname="breakAfterAcquireFailure"   value="false"/> 
  23.         <propertyname="testConnectionOnCheckout"   value="false"/> 
  24.         <propertyname="testConnectionOnCheckin"    value="true"/> 
  25.     </bean> 
  26.  
  27.  
  28.     <bean id='ConfigurationBean'            class="com.hnyd.demo.hibernate.util.Configuration"> 
  29.         <propertyname="location"           value="file:config/config.properties"/> 
  30.     </bean> 
  31.      
  32.     <!-- 创建一个sessionFactory工厂,用于注入hibernate --> 
  33.     <beanid="sessionFactory"               class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"> 
  34.         <propertyname="dataSource"     ref="SystemDataSource"></property> 
  35.         <propertyname="hibernateProperties"> 
  36.             <props> 
  37.                 <propkey="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop> 
  38.                 <propkey="hibernate.show_sql">true</prop> 
  39.                 <!-- <prop key="hibernate.hbm2ddl.auto">update</prop> --> 
  40.                 <propkey="hibernate.jdbc.batch_size">20</prop> 
  41.             </props> 
  42.         </property> 
  43.         <propertyname="mappingResources"> 
  44.             <list> 
  45.                 <value>hbm/User.hbm.xml</value> 
  46.             </list> 
  47.         </property> 
  48.     </bean> 
  49.      
  50.     <!-- 创建一个hibernate模板 --> 
  51.     <beanid="hibernateTemplate"            class="org.springframework.orm.hibernate3.HibernateTemplate"> 
  52.         <propertyname="sessionFactory"> 
  53.             <refbean="sessionFactory"/> 
  54.         </property> 
  55.     </bean> 
  56.      
  57.     <beanid="jdbcTemplate"         class="org.springframework.jdbc.core.JdbcTemplate"> 
  58.         <propertyname="dataSource"     ref="SystemDataSource"/> 
  59.     </bean> 
  60.  
  61.  
  62.     <bean id="sjdbcTemplate"            class="org.springframework.jdbc.core.simple.SimpleJdbcTemplate"> 
  63.         <constructor-arg> 
  64.             <refbean="SystemDataSource"/> 
  65.         </constructor-arg> 
  66.     </bean> 
  67. </beans> 

UserDao.java

[java] view plaincopyprint?
  1. public class UserDaoextends HibernateDaoSupport implements IUserDao { 
  2.  
  3.     @Override 
  4.     public void add(User user) { 
  5.         this.getHibernateTemplate().save(user); 
  6.     } 
  7.  
  8.     @Override 
  9.     public void delete(int uid) { 
  10.         User user=new User(); 
  11.         user.setId(uid); 
  12.         this.getHibernateTemplate().delete(user); 
  13.     } 
  14.  
  15.     @Override 
  16.     public User findById(int uid) { 
  17.         return (User)this.getHibernateTemplate().get(User.class,uid); 
  18.     } 

查找 原因发现HibernateDaoSupport缺少注入SessionFactory,HibernateDaoSupport提供了基于AOP事务的自动处理,程序员完全可以不用理会事务的开始与提交。在JDBC中一个Connection对象使用一个事务,那么在Hibernate中一个事务肯定要关联一个SessionFactory了,然而这个SessionFactory却没有在DAO中体现。其实主要的原因是HibernateDaoSupport类已经默默地做了封装的工作,它用一个setSessionFactory方法将SessionFactory进行注入,所以继承自HibernateDaoSupport类的DAO都会具有SessionFactory的属性,从而可以通过SessionFactory创建Session实例操作数据库。
  在继承HibrnateDaoSupport的DAO实现里,Hibernate Session的管理完全不需要Hibernate代码打开,而由Spring来管理。Spring会根据实际的操作,采用“每次事务打开一次session”的策略,自动提高数据库访问的性能。


因此需要定义一个父类,父类要有一个hibernateTemplate属性,并且注入引用,配置如下:

[html] view plaincopyprint?
  1. <!-- 创建一个dao注入的模板 --> 
  2. <bean id="daoTemplate"abstract="true"> 
  3. <propertyname="hibernateTemplate"> 
  4.         <refbean="hibernateTemplate"/> 
  5.     </property> 
  6. </bean> 

所有使用hibernate的dao都配置为该类的子类,于是applicationContext.xml配置如下:

[html] view plaincopyprint?
  1. <?xmlversion="1.0"encoding="UTF-8"?> 
  2. <beans 
  3.     xmlns="http://www.springframework.org/schema/beans" 
  4.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
  5.     xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd"> 
  6.  
  7.     <importresource="applicatonDBContext.xml"/> 
  8.      
  9.     <!-- 创建一个dao注入的模板 --> 
  10.     <bean id="daoTemplate"abstract="true"> 
  11.         <propertyname="hibernateTemplate"> 
  12.             <refbean="hibernateTemplate"/> 
  13.         </property> 
  14.     </bean> 
  15.      
  16.     <bean id="userDao"class="com.hnyd.demo.hibernate.jdbc.dao.impl.UserDao"parent="daoTemplate">     
  17.     </bean> 
  18. </beans> 


经过上面的配置后,就可以正常使用了