Spring+hibernate的session问题
来源:互联网 发布:win7打印机无usb端口 编辑:程序博客网 时间:2024/05/16 18:58
在spring框架和hibernate框架集成的时候,根据不同的需求,或者个人的习惯问题。会出现多种多样的数据访问层的代码。本篇文章拣出几个典型的问题,加以浅谈。
DAO层中的某个类如果没有继承自HibernateDaoSupport。而是使用SessionFactory获取对象。(配置文件中已经配置了sessionFactory对象)。可能使用注解进行了注入。
获取session的方式:
1、sessionFactory.openSession();
该方式获取的session是不受spring管理的,在和数据库交互的过程中,需要手动的打开和关闭事务。并且关于session的问题,还是那个原则“谁创建谁关闭”。意思就是,必须手动关闭session。哪怕你使用了@Transactional注解。
2、sessionFactory.getCurrentSession();
在一不小心的情况下,可能发生一个异常:
org.hibernate.HibernateException: No Hibernate Session bound to thread, and configuration does not allow creation of non-transactional one here
at org.springframework.orm.hibernate3.SpringSessionContext.currentSession(SpringSessionContext.java:63)
at org.hibernate.impl.SessionFactoryImpl.getCurrentSession(SessionFactoryImpl.java:622)
第一种方法:
这个时候可以加入spring提供的事务管理机制来改变这个问题。例如加上@Transactional注解,不过事先要在配置文件中定义好。示例如下:
<tx:annotation-driven transaction-manager="transactionManager" />
<bean id="transactionManager"
class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory"></property>
</bean>
当然也要引入tx的命名空间。这个时候,不需要显式的开启事务和关闭session的操作,因为spring已经替我们做了。
第二种方法:
如果你不打算让spring来管理事务。你可以在配置文件中,加入:
<prop key="hibernate.current_session_context_class">thread</prop>
要 是出现org.hibernate.HibernateException:persist is not valid without active transaction那你就要手动的来开启和关闭事务了。这种情况加入@Transactional注解也是没有作用的。这种情况下session不需 要手动关闭。
最后来个小技巧:
如果没有使用spring的组件扫描机制的话,需要在配置文件中配置DAO层的一些类(继承自HibernateDaoSupport)。
其中可能会出现这样的代码:
<bean id="personDao" class="com.dao.PersonDao"> <property name="sessionFactory" ref="sessionFactory" /></bean>
其中<property name="sessionFactory" ref="sessionFactory" />这个配置,可能会重复N次。
这时候,可以在配置文件中加入:
<bean id="hibernateDaoSupport" abstract="true" class="org.springframework.orm.hibernate3.support.HibernateDaoSupport"> <propery name="sessionFactory" ref="sessionFactory"/></bean>
然后再:
<bean id="personDao" class="com.dao.PersonDao" parent="hibernateDaoSupport" />
- spring+hibernate的session问题
- spring+hibernate的session问题
- Spring+hibernate的session问题
- spring quartz hibernate no session 的问题
- Hibernate的session问题
- Spring+hibernate的session问题 声明事务管理是否起作用
- spring与hibernate集成的session事务控制问题解析
- Spring与Hibernate集成中的session问题
- Spring与Hibernate集成中的session问题
- Spring与Hibernate集成中的session问题
- spring+hibernate多线程下session问题
- Spring与Hibernate集成中的session问题
- 记录hibernate+spring中session释放问题
- Spring与Hibernate集成中的Session问题
- Hibernate和spring中的session问题整理
- spring 控制hibernate的session何时关闭.
- Spring中获得Hibernate Session的方法
- Spring中Hibernate的session如何断开
- HttpServletRequestWrapper 用法
- MySql查询优化:连接查询排序
- 关于企业的互联网思维
- Mysql
- 加密术 oj
- Spring+hibernate的session问题
- mac MAMP pro安装和破解
- js控制页面跳转并传参数,获取参数
- 仿直播点赞动画
- No Hibernate Session bound to thread, and configuration does not allow creation
- AndroidStudio打包成jar
- 【Java】反射机制
- Mysql
- selenium+python日期生成