| 
 这种情况就是在通过spring配置hibernate4的时候(注意,这里是hibernate4不是hibernate3,hibernate3的),使用的是HibernateDaoSupport的这种方式:  
public class BaseDao extends HibernateDaoSupport{  
*****  
}  
类似这种方式,然后在applicationContext.xml配置为:  
***  
<!-- 配置 SessionFactory -->  <bean id="sessionFactory"  class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">  <property name="dataSource" ref="dataSource" />  <property name="hibernateProperties" ref="hibernate-hibernateProperties"></property>  <property name="packagesToScan" ref="hibernate-packagesToScan"></property>  <property name="mappingLocations" ref="hibernate-mappingLocations"></property>  </bean>    <bean id="baseDao" class="com.myprj.auth.dao.BaseDao">  <property name="sessionFactory">  <ref bean="sessionFactory" />  </property>  </bean>  
结果一运行会报:  
'sessionFactory' or 'hibernateTemplate' is required 这种错误  
结果查看HibernateDaoSupport的源代码得知:setSessionFactory方法是:  
public final void setSessionFactory(SessionFactory sessionFactory) {   if (this.hibernateTemplate == null || sessionFactory != this.hibernateTemplate.getSessionFactory()) {    this.hibernateTemplate = createHibernateTemplate(sessionFactory);   }  }  
说明在子类中想通注解设置 sessionFactory (重写setter方法是不行的),那么怎么办,我们只能通过super.setSessionFactory ()调用  
解决办法:  
@Resource(name="sessionFactory")  
private void setMySessionFactory(SessionFactory sessionFactory){  
  //这个方法名可以随便写,@Resource可以通过name 或者type来装载的。   super.setSessionFactory(sessionFactory);  }  
   
所以最终可以发现在applicationContext.xml配置文件中的这个bean:  
<bean id="baseDao" class="com.myprj.auth.dao.BaseDao"> <property name="sessionFactory"> <ref bean="sessionFactory" /> </property> </bean>  
是没用的  
但是,注意,这里是hibernate4不是hibernate3,hibernate3是可以这样配置的,在使用hibernate3的spring sessionFactory中可以通过在applicationContext.xml文件中:  
<bean id="baseDao" class="com.myprj.auth.dao.BaseDao"> <property name="sessionFactory"> <ref bean="sessionFactory" /> </property> </bean>  
然后直接写:  
public class BaseDao extends HibernateDaoSupport{  
*****  
}就可以  |