在继承了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层构造好的然后传入
-
packagecom.test.spring.dao;
-
-
importorg.springframework.orm.hibernate3.support.HibernateDaoSupport;
-
-
importcom.test.spring.model.Log;
-
-
publicclassLogDaoMysqlImplextendsHibernateDaoSupportimplementsLogDao{
-
-
publicvoidaddLog(Loglog){
-
-
-
this.getHibernateTemplate().getSessionFactory().openSession().save(log);
-
-
}
-
-
}
执行结果如下,log4j产生的日志被忽略
-
org.springframework.aop.aspectj.MethodInvocationProceedingJoinPoint:execution(addUser)
-
checksecurity
-
org.springframework.aop.aspectj.MethodInvocationProceedingJoinPoint:execution(addUser)
-
checksecurity
-
org.springframework.aop.aspectj.MethodInvocationProceedingJoinPoint:execution(addLog)
-
checksecurity
-
org.springframework.aop.aspectj.MethodInvocationProceedingJoinPoint:execution(addLog)
-
checksecurity
-
Hibernate:insertintolog(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的原因。
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层构造好的然后传入
-
packagecom.test.spring.dao;
-
-
importorg.springframework.orm.hibernate3.support.HibernateDaoSupport;
-
-
importcom.test.spring.model.Log;
-
-
publicclassLogDaoMysqlImplextendsHibernateDaoSupportimplementsLogDao{
-
-
publicvoidaddLog(Loglog){
-
-
-
this.getHibernateTemplate().getSessionFactory().openSession().save(log);
-
-
}
-
-
}
执行结果如下,log4j产生的日志被忽略
-
org.springframework.aop.aspectj.MethodInvocationProceedingJoinPoint:execution(addUser)
-
checksecurity
-
org.springframework.aop.aspectj.MethodInvocationProceedingJoinPoint:execution(addUser)
-
checksecurity
-
org.springframework.aop.aspectj.MethodInvocationProceedingJoinPoint:execution(addLog)
-
checksecurity
-
org.springframework.aop.aspectj.MethodInvocationProceedingJoinPoint:execution(addLog)
-
checksecurity
-
Hibernate:insertintolog(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的原因。
分享到:
相关推荐
.相同点:在applicationConext.xml中 ... HibernateDaoSupport: 在impl中要调用的方法要getHibernateTemplate().delete(user); UserDaoHiberateImpl: 在impl中要调用的方法要hibernateTemplate.save(user);
HibernateDaoSupport的使用
Spring hibernate3. HibernateDaoSupport 源码
springboot2.0多数据源集成hibernate配置hibernateDaoSupport, dao层继承hibernateDaoSupport, 不使用jpa方式。
* 继承HibernateDaoSupport类,使用this.HibernateTemplate这个类持久化数据 * HibernateTemplate是对session的轻量级的封装 * 默认事务回滚异常是RuntiimeException(包括所有继承RuntimeException的子类).普通...
HibernateDaoSupport详解 HibernateDaoSupport详解
hibernateDaoSupport类的详解!
3. Spring 由哪些模块组成? 4. 核心容器(应用上下文) 模块 5. BeanFactory – BeanFactory 实现举例 6. XMLBeanFactory 7. 解释 AOP 模块 8. 解释 JDBC 抽象和 DAO 模块 9. 解释对象/关系映射集成模块 10. 解释 ...
NULL 博文链接:https://yizhilong28.iteye.com/blog/818989
NULL 博文链接:https://wxinpeng.iteye.com/blog/1162157
总结对比了Spring对JDBCTemplate和SpringTemplate的整合使用方法,尤其JdbcDaoSupport和HibernateDaoSupport的使用方法
SSH整合(其中dao用extends HibernateDaoSupport方式)总结【图解】
一、 开始使用annotation配置Spring 16 二、 @Autowired、@Qualifier 16 (一) @Autowired 16 (二) @Qualifier 17 三、 @Resource(重要、推荐) 17 (一) JSR-250 17 (二) @Resource 17 四、 @Componet 18 五、 @Scope...
1.1 为什么使用Spring 1.1.1 J2EE开发者的一天 1.1.2 Spring的承诺 1.2 Spring是什么 1.3 开始Spring之旅 1.4 理解反向控制 1.4.1 依赖注入 1.4.2 IoC应用 1.4.3 企业级应用中的...
其中包含有org.springframework.orm.hibernate3.support.HibernateDaoSupport.class,
1、Spring 3.x 对 Hibernate 4.x 不提供 HibernateDaoSupport,所以在dao的实现层注入SessionFactory 2、报错:org.hibernate.HibernateException: No Session found for current thread 意思是必须在...
HibernateDaoSupport 类的jar HibernateDao 的jar
spring-boot 集成hibernate,使用druid数据库连接池,dao继承HibernateDaoSupport 的实现,
HibernateDaoSupport分页.txt
HibernateCallback是一个接口,位于org.springframework.orm.hibernate3中。 该接口中只有一个方法doInHibernate(Session session)。 通常,程序中采用实现HibernateCallback的匿名内部类来获取HibernateCallback的...