当自定义的Dao实现了org.springframework.orm.hibernate3.support.HibernateDaoSupport 时,若Dao是以注解的形式提供bean,则要以注解的形式注入SessionFactory,而HibernateDaoSupport 中相关的set方法都是final 的,即不能覆盖:
public final void setSessionFactory(SessionFactory sessionFactory) { if (this.hibernateTemplate == null || sessionFactory != this.hibernateTemplate.getSessionFactory()) { this.hibernateTemplate = createHibernateTemplate(sessionFactory); } } public final void setHibernateTemplate(HibernateTemplate hibernateTemplate) { this.hibernateTemplate = hibernateTemplate; }
解决方法:
@Transactional @Repository("baseLocationDao") public class BaseLocationDaoImpl extends HibernateDaoSupport implements LocationDao{ private Logger logger = LoggerFactory.getLogger(BaseLocationDaoImpl.class); @Resource public void setMySessionFactory(SessionFactory sessionFactory){ super.setSessionFactory(sessionFactory); } }
而SessionFactory的实现类也应该配置成注解形式的:
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean"> <property name="dataSource" ref="dataSource" /> <property name="packagesToScan" value="com.pbn.oss.location"></property> <property name="schemaUpdate" value="true" /> <property name="hibernateProperties"> <props> <prop key="hibernate.format_sql">true</prop> <prop key="hibernate.show_sql">true</prop> <prop key="hibernate.dialect">org.hibernate.dialect.SQLServerDialect</prop> <prop key="hibernate.query.factory_class">org.hibernate.hql.ast.ASTQueryTranslatorFactory</prop> </props> </property> </bean>