您的位置:首页 > 其它

Session、SessionFactory、HibernateTemplate实例是如何从HibernateDaoSupport抽象类实例取出

2011-05-17 13:42 459 查看
相信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截取:

<bean id="emailDao" class="com.gdpu.project.dao.impl.EmailDaoImpl">
   <property name="sessionFactory">  3    <ref bean="sessionFactory" />      4  </property>   5 </bean>


4)、从HibernateDaoSupport的取Session、SessionFactory、HibernateTemplate实例的透析:
请看HibernateDaoSupport 的定义,从以下代码得出以下:

1、只要向EmailDaoImpl注入了sessionFactory,EmailDaoImpl而又继承了HibernateDaoSupport 这个抽象类,

2、也就是说EmailDaoImpl已经具有了HibernateDaoSupport(其方法和属性是final,不可重写) 里面的所有功能和属性,

3、sessionFactory的注入调用了其setter方法,进而调用了createHibernateTemplate(sessionFactory),实例化了一个HibernateTemplate对象(委派了 HibernateTemplate构造)。

4、现在有个HibernateTemplate和SessionFactory实例了,显然,此时可以通过相关方法得到Session、SessionFactory、HibernateTemplate等这些实例了。

public abstract class HibernateDaoSupport extends DaoSupport {

privateHibernateTemplate hibernateTemplate;

public final void setSessionFactory(SessionFactory sessionFactory) {
  if (this.hibernateTemplate == null || sessionFactory != this.hibernateTemplate.getSessionFactory()) {
    this.hibernateTemplate = createHibernateTemplate(sessionFactory);
  }

23 }

public final SessionFactory getSessionFactory() {
  return (this.hibernateTemplate != null ? this.hibernateTemplate.getSessionFactory() : null);
}

public final void setHibernateTemplate(HibernateTemplate hibernateTemplate) {
  this.hibernateTemplate = hibernateTemplate;
}

public final HibernateTemplate getHibernateTemplate() {
  return this.hibernateTemplate;
}

protected final Session getSession()
throwsDataAccessResourceFailureException, IllegalStateException {
  return getSession(this.hibernateTemplate.isAllowCreate());
}

58//部分代码以略掉

58        ......

59}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: