Session的策略

来源:互联网 发布:末日拾荒者 知乎 编辑:程序博客网 时间:2024/06/08 03:54

今天遇到了Spring和Hibernate4.2.x系列个问题
  save is not valid without active transaction
这句话一看就是和事务有关,我开始一直找Service层和dao层里面代码有问题吗,结果白找了
最后在这里

<prop key="hibernate.current_session_context_class">org.springframework.orm.hibernate4.SpringSessionContext</prop>

  我开始配置的是Thread在Hibernate4.2.x中不认这个,只有org.springframework.orm.hibernate4.SpringSessionContext才认,所以在此记录顺便说一下Session策略的作用
  

current_session_context_class

这个是hibernate3.1以后的一个新扩展,目的在于可以让我们在某一个上下文环境(比如说当前线程)中可以通过SessionFactory.getCurrentSession()得到同一个session会话。

使用 Hibernate 的大多数应用程序需要某种形式的“上下文相关的”会话,特定的会话在整个特定的上下文范围内始终有效。然而,对不同类型的应用程序而言,要为什么是组成这种“上下文”下一个定义通常是困难的;不同的上下文对“当前”这个概念定义了不同的范围。
在spring中应该把这个上下文交给Spring去管理(因为我们的事务aop也是在spring范围中

为什么配置Thread会出错

因为以前在Hibernate中配置的Thread,并没有Spring,所以当前Session不会牵扯到Spring。
但是事务管理在Spring中去了以后就不能Thread,必须org.springframework.orm.hibernate4.SpringSessionContext

  class SpringSessionContext implements CurrentSessionContext

SpringSessionContext 实现了CurrentSessionContext的接口,currentSession()方法就会返回当前Session

0 0
原创粉丝点击