使用Spring的HibernateDaoSupport时的getSession()3个方法的区别

在继承了HibernateDaoSupport的Dao中,

 this.getsession实际上是调用了父类HibernateDaoSupport中的方法获得session。使用spring管理hibernate的SessionFactory的时候,这个方法会从session池中拿出一session。这样做有可能有问题,尽管这种方式拿到的Session会自动关闭,但是他是有一定的失效策略的,而且在超session池连接数的时候,spring无法自动的关闭这些session。  不推荐使用

          
 this.getHibernateTemplate().getSessionFactory().getCurrentSession()从spring管理的sessionFactory中创建一个绑定线程的session。Spring会根据该线程的执行情况来自动判断是关闭session还是延迟关闭。这样做可以避免手动的管理实务,同时一个线程最多开启和关闭一次session又可以提高程序的性能。 极力推荐使用这种方法 

    this.getHibernateTemplate().getSessionFactory().OpenSession。这种方法从spring管理的sessionFactory中创建一个session,此session不是线程绑定的。当执行完一个实务的时候自动关闭session。这种方法不用手动管理实务,但是同一个线程多次的开启和关闭session,浪费系统资源和影响执行效率,正常情况下还是不要用了。 

这个是测试的dao层 log是在servi层构造好的然后传入

package com.test.spring.dao;

import org.springframework.orm.hibernate3.support.HibernateDaoSupport;

import com.test.spring.model.Log;

public class LogDaoMysqlImpl extends HibernateDaoSupport implements LogDao  {
   
 public void addLog(Log log) {
 //this.getSession().save(log);
   //getHibernateTemplate().save(log);
    this.getHibernateTemplate().getSessionFactory().openSession().save(log);
     
 }

}

执行结果如下,log4j产生的日志被忽略 

org.springframework.aop.aspectj.MethodInvocationProceedingJoinPoint: execution(addUser)
check security
org.springframework.aop.aspectj.MethodInvocationProceedingJoinPoint: execution(addUser)
check security
org.springframework.aop.aspectj.MethodInvocationProceedingJoinPoint: execution(addLog)
check security
org.springframework.aop.aspectj.MethodInvocationProceedingJoinPoint: execution(addLog)
check security
Hibernate: insert into log (type, time) values (?, ?)

没有进行session的关闭(不用spring也不用关闭session,session的关闭交给SessionFactory自动处理,但是使用spring的this.getSession没有使用spring创建SessionFactory而是直接从spring的session缓冲池拿到session,spring的session缓冲池中一般默认生成10session,前面也说了,可能是其他线程使用完没有关闭的,所以要显示的调用close,释放资源,因为取出来就放不回去了。所以要手动关闭,而且他两种获取的方法使用了spring提供的SessionFactory,spring会自动的处理没有必要进行手动关闭),就连事物的开启与关闭也不用。

这就是使用Spring的好处,把切面上零散的代码统一进行处理。

--------------------------------------------------------华丽的分割线--------------------------------------------------------------




1.getCurrentSession(); 
获得当前会话中的session,该session有容器自行维护管理,Spring可以代理事务。
2.this.getSession();
从当前的执行中获得或创建一个hibernate的session对象,自己关闭,释放连接资源。
3.openSession();
调用函数自行创建一个数据库的连接,并将其打开,在使用Spring操作非查询语句的请况下,Spring的事务对该session对象不起到事务管理的作用,所以该session对象应当由程序员自己关闭,释放连接资源。

在项目中使用到了Spring框架技术,就是说明,我们不想直接去获取,打开Session,开始一个事务,处理异常,提交一个事务,最后关闭一个Session,使用Spring后,这样的工作对我们来讲太过于繁琐,

我们自己只专注于业务,不想去作这些重复而繁琐的操作。我们把这些责任全部委托给了Spring的HibernateTemplate,然后使用声明式的配置来实现这样的功能。

如果我们通过类似getSession()这样的方法获得了Session,那就意味着我们放弃了上面所说的一切好处。


在Spring的框架中HibernateTemplate提供了相当多有用的辅助功能。我们想用它提供的辅助功能。但是HibernateTemplate包装了

Hibernate的代码,使用了它以后不能直接访问到Session了。

HibernateTemplate提供HibernateCallback,就是为了满足这种使用了HibernateTemplate的情况下,仍然需要直接访问Session的需求而来的。它提供了在HibernateTemplate里面直接访问Session的能力,程序员不必人为的管理session对象, 这个就是使用HibernateCallback的原因。


  • 2
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Spring ORM 是 Spring 框架的一个模块,它提供了一种方便的方式来集成 ORM 框架,如 Hibernate、JPA 等,以便于在 Spring 应用中使用 ORM 技术。下面是 Spring ORM 的使用教程: 1. 添加依赖 在 Maven 或 Gradle 中添加 Spring ORM 依赖: Maven: ```xml <dependency> <groupId>org.springframework</groupId> <artifactId>spring-orm</artifactId> <version>5.3.8</version> </dependency> ``` Gradle: ```groovy implementation 'org.springframework:spring-orm:5.3.8' ``` 2. 配置数据源 在 Spring 应用中使用 ORM 技术,需要先配置数据源。可以使用 Spring 提供的 DriverManagerDataSource 或者使用连接池技术,如 C3P0。 例如,配置 DriverManagerDataSource: ```xml <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> <property name="driverClassName" value="com.mysql.jdbc.Driver" /> <property name="url" value="jdbc:mysql://localhost:3306/test" /> <property name="username" value="root" /> <property name="password" value="123456" /> </bean> ``` 3. 配置 ORM 框架 Spring ORM 提供了对多种 ORM 框架的集成支持,如 Hibernate、JPA 等。在使用之前,需要先配置相应的 ORM 框架。 例如,配置 Hibernate: ```xml <bean id="sessionFactory" class="org.springframework.orm.hibernate5.LocalSessionFactoryBean"> <property name="dataSource" ref="dataSource" /> <property name="packagesToScan" value="com.example.entity" /> <property name="hibernateProperties"> <props> <prop key="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</prop> <prop key="hibernate.show_sql">true</prop> </props> </property> </bean> ``` 4. 配置事务管理器 Spring ORM 还提供了事务管理器,通过它可以方便地管理事务。在 Spring 应用中使用 ORM 技术,需要先配置事务管理器。 例如,配置 Hibernate 的事务管理器: ```xml <bean id="transactionManager" class="org.springframework.orm.hibernate5.HibernateTransactionManager"> <property name="sessionFactory" ref="sessionFactory" /> </bean> ``` 5. 配置 DAODAO 层是 ORM 框架和业务逻辑层之间的桥梁。在 Spring 应用中使用 ORM 技术,需要先配置 DAO 层。 例如,配置 HibernateDAO 层: ```java @Repository public class UserDaoImpl extends HibernateDaoSupport implements UserDao { public User findUserById(int id) { return getHibernateTemplate().get(User.class, id); } public void saveUser(User user) { getHibernateTemplate().save(user); } public void updateUser(User user) { getHibernateTemplate().update(user); } public void deleteUser(User user) { getHibernateTemplate().delete(user); } } ``` 6. 使用 ORM 技术 配置完成后,就可以在业务逻辑层中使用 ORM 技术了。 例如,使用 Hibernate: ```java @Service @Transactional public class UserServiceImpl implements UserService { @Autowired private UserDao userDao; public User findUserById(int id) { return userDao.findUserById(id); } public void saveUser(User user) { userDao.saveUser(user); } public void updateUser(User user) { userDao.updateUser(user); } public void deleteUser(User user) { userDao.deleteUser(user); } } ``` 以上就是 Spring ORM 的使用教程,希望能对你有所帮助。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值