当自定义的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>