Session、SessionFactory、HibernateTemplate实例是如何从HibernateDaoSupport抽象类实例取出
相信HibernateDaoSupport这一个类在Hibernate里面常见了,但是它是抽象类,怎么就可以灵活、方便直接的取出相关的有用实例?
1)、此为一xxDaoImpl类:
public class EmailDaoImpl extends HibernateDaoSupport implements EmailDao {
......
}
2)、你是否觉得以下查询有点奇怪,Session怎么可以直接就取得?以下然我为你解析下其原理吧!
query=getSession().createQuery("select count(*) from Email as model where model." + propertyName + "= :propertyName");
3)、Spring容器的bean截取:
1 <bean id="emailDao" class="com.gdpu.project.dao.impl.EmailDaoImpl">
2 <property name="sessionFactory">3 <ref bean="sessionFactory" />4 </property>5 </bean>
请看HibernateDaoSupport 的定义,从以下代码得出以下:
1、只要向EmailDaoImpl注入了sessionFactory,EmailDaoImpl而又继承了HibernateDaoSupport 这个抽象类,
2、也就是说EmailDaoImpl已经具有了HibernateDaoSupport(其方法和属性是final,不可重写) 里面的所有功能和属性,
3、sessionFactory的注入调用了其setter方法,进而调用了createHibernateTemplate(sessionFactory),实例化了一个HibernateTemplate对象(委派了 HibernateTemplate构造)。
4、现在有个HibernateTemplate和SessionFactory实例了,显然,此时可以通过相关方法得到Session、SessionFactory、HibernateTemplate等这些实例了。
14 public abstract class HibernateDaoSupport extends DaoSupport {
15
16 privateHibernateTemplate hibernateTemplate;
18
19 public final void setSessionFactory(SessionFactory sessionFactory) {
20 if (this.hibernateTemplate == null || sessionFactory != this.hibernateTemplate.getSessionFactory()) {
21 this.hibernateTemplate = createHibernateTemplate(sessionFactory);
22 }
23 }
24
25 public final SessionFactory getSessionFactory() {
32 return (this.hibernateTemplate != null ? this.hibernateTemplate.getSessionFactory() : null);
33 }
36 public final void setHibernateTemplate(HibernateTemplate hibernateTemplate) {
37 this.hibernateTemplate = hibernateTemplate;
38 }
39
41 public final HibernateTemplate getHibernateTemplate() {
42 return this.hibernateTemplate;
43 }
45
53 protected final Session getSession()
54 throwsDataAccessResourceFailureException, IllegalStateException {55
56 return getSession(this.hibernateTemplate.isAllowCreate());
57 }
58//部分代码以略掉
58 ......
59}