spring整和hibernate DAO中两种不同的获取session的方式

这个标题被我描述的太乱太杂了,其实要讲的主要是关于怎么得到用来操作数据层所使用的hibernateTemplate(另一个种方法是通过jdbcTemplate,但推荐使用第一种)。而hibernateTemplate是通过sessionFactory得到的,sessionFactory存在于hibernateDAOSupport来得到。(一切都是spring给我们封装好的)

这里的关键是怎么通过spring对DAO的操作得到我们要的hibernateTemplate

我们先看spring中的一段源码。

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


还有一个final方法


public final HiberanteTemplate getHibernateTemplate()。。。。


也就是要得到hibernateTemplate就要先保证sessionFactory不是NULL,但是又因为这两个方法都是final所以,DAO层继承了这个hibernateDAOSupport之后不能重写, 所以这里就出现了下面几种可以得到hibernateTemplate的方法


①采用通过spring注入sessionFactory,前提是让DAO层继承hibernateDAOSupport,这样DAO类也就有了sessionFactory,然后通过在xml中编写进行注入。

这样使用起来的确是很方便(详情见后面代码)但是有不好的地方。其一你这个DAO层继承了hibernateDAOSupport之后,由于Java只能继承一个父类,便失去了继承其他的可能性。其二,这回增加耦合度,让代码至少不那么“干净透明”


②采用通过我不继承hibernateDAOSupport,而是直接给我的DAO层注入一个hibernateTemplate(因为我们的最终目标就是这个hibernateTemplate,我们注入sessionFactory是一个不得不为的行为,spring给我们的就是通过只要给spring一个sessionFactory,spring就还你一个hibernateTemplate)

这样的话每一个DAO层中都有一个对hibernateTemplate的set方法(为了注入),这样的确不用再去继承hibernateDAOSupport,可DAO层的代码中会多和关键操作无关的代码,如上面的set


还是看代码直接清晰,如下


采用第一种方法:

  1. <!-- 以下为用户管理的依赖注入 -->
  2. <bean id= "UserDao" class= "org.nbu.lab1220.daoImpl.UserDaoImpl">
  3. <property name= "sessionFactory">
  4. <ref local= "sessionFactory" />
  5. </property>
  6. </bean>
  1. public class UserDaoImpl extends HibernateDaoSupport implements UserDao {
  2. public ArrayList<User> loginVaild(String userAccount, String password) {
  3. return (ArrayList<User>) getHibernateTemplate().find( "from User p where p.userAccount=? and p.password=?", new Object[]{userAccount,password});
  4. }}


采用第二种方法:

  1. <bean id="hibernateTemplate" class="org.springframework.orm.hibernate3.HibernateTemplate">
  2. <property name="sessionFactory" ref="sessionFactory"> </property>
  3. </bean>
  1. <bean id="UserDao" class="org.nbu.lab1220.daoImpl.UserDaoImpl">
  2. <property name="hibernateTemplate" ref="hibernateTemplate"> </property>
  3. </bean>

  1. public class UserDaoImpl implements UserDao{
  2. private HibernateTemplate hibernateTemplate;
  3. public HibernateTemplate getHibernateTemplate() {
  4. return hibernateTemplate;
  5. }
  6. public void setHibernateTemplate(HibernateTemplate hibernateTemplate) {
  7. this.hibernateTemplate = hibernateTemplate;
  8. }
  9. @SuppressWarnings( "unchecked")
  10. public ArrayList<User> loginVaild(String userAccount, String password) {
  11. return (ArrayList<User>) this.hibernateTemplate.find( "from User p where p.userAccount=? and p.password=?", new Object[]{userAccount,password});
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值