thread 属性 thread.sleep

<property name="current_session_context_class">thread</property>

这个属性的作用:这样配置是本地jdbc事务配置,你通过getCurrentSession创建的session会绑定到当前线程

平时在单独使用hibernate的时候,习惯于配置属性

<property name="current_session_context_class">thread</property>

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

后来当我们把spring,hibernate整合的时候,在spring的主配置文件当中,我们也习惯于带入这样的配置

<property name="hibernateProperties">

<props>

<prop key="hibernate.current_session_context_class">thread</prop>

,接下来在spring配置文件中,会使用spring2.x的声明式的方式来配置事务

<tx:advice id="txAdvice" transaction-manager="transactionManager">,<aop:pointcut,<aop:advisor等等配置指定哪些方法上由spring来管理hiberante的事务,这个时候我们试着运行一个类似于这样的方法

public void find() {

Session se = sf.getCurrentSession();

//此处不需要se.beginTransaction(),事务已经交由spring管理

Dept d = (Dept) se.get(Dept.class, new Long(12));

}

会得到一个异常:get is not valid without active transaction.

这个错误一般情况是因为由getCurrentSession得到的session中没有获得的transaction,我们一般要手动的调用se.beginTransaction(),来打开一个活动的事务.但是问题是,我们在spring的配置文件中不是已经通过aop,指定了此处由spring来管理事务吗,怎么还要手动处理事务?

答案:

<prop key="hibernate.current_session_context_class">thread</prop>改为

<prop key="hibernate.current_session_context_class">org.springframework.orm.hibernate3.SpringSessionContext</prop>(默认配置)

参考:

1. hibernate文档:

使用 Hibernate 的大多数应用程序需要某种形式的“上下文相关的”会话,特定的会话在整个特定的上下文范围内始终有效。然而,对不同类型的应用程序而言,要为什么是组成这种“上下文”下一个定义通常是困难的;不同的上下文对“当前”这个概念定义了不同的范围



2.在hibernate中,thread,jta,manager的配置其实都是对应了3个hibernate的实现类

org.hibernate.context.ThreadLocalSessionContext









3.在sessionFactory配置文件中

应将hibernate.current_session_context_class设为org.springframework.orm.hibernate3.SpringSessionContext(默认为此值)

应当把session要绑定的上下文设置为由spring环境管理(因为我们的事务aop也是在spring范围中),这个时候spring中的事务配置才会起作用(当然,以前是thread上下文环境的session,而事务托管在spring上下文中,当然spring无法管理到thread上下文的session的事务咯)

综上所述,其实仔细看

ThreadLocalSessionContext,JTASessionContext,ManagedSessionContext,SpringSessionContext

thread 属性 thread.sleep
我们都会发现,他们都实现了一个接口org.hibernate.context.CurrentSessionContext关于这个接口,

请参阅org.hibernate.context.CurrentSessionContext接口的 Javadoc,那里有关于它的契约的详细讨论。它定义了单一的方法,currentSession(),特定的实现用它来负责跟踪当前的上下文相关的会话



最后,我们知道,其实线程绑定也好,上下文绑定也好,最后都是,使用实现了CurrentSessionContext接口的一个类,来跟踪session,然后我们通过这个类的对象来获得被它跟踪的session,以达到在我们定义的上下文环境中调用getCurrentSession方法获得的总是同一个session

  

爱华网本文地址 » http://www.aihuau.com/a/25101013/156000.html

更多阅读

征途弓箭手属性加点 手机征途怎么分享

征途弓箭手属性加点——简介征途是热门的网络游戏,征途弓箭手属性加点——方法/步骤征途弓箭手属性加点 1、1、弓箭手的加点非常的复杂,可以选择2力,2体 1力 3体征途弓箭手属性加点 2、2、此处我个人的选择是全力,后期不够了可以再

魔兽世界怎样重铸装备 魔兽装备属性重铸

魔兽世界怎样重铸装备——简介魔兽世界重铸装备功能魔兽世界怎样重铸装备——方法/步骤魔兽世界怎样重铸装备 1、重铸装备是指将装备中一条不必要的副属性的百分之四十替换成另一条副属性。魔兽世界怎样重铸装备 2、副属性包括精

九天仙梦宠物属性快速提升攻略秘籍 wow快速提升宠物等级

玩九天仙梦这么久了,简单介绍我的宠物提升到27成长的过程,以供大家借鉴。大家都知道同成长的宠物合成后属性会提高1点。例如:11成长+11成长=12成长。但是用这种办法抓宠物会抓到你吐血。九天仙梦宠物属性快速提升攻略秘籍——步骤/方法

我的电脑 属性打不开:1 用注册表修复

【我的电脑】属性打不开:[1]用注册表修复——简介电脑中“我的电脑”的属性突然打不开了,该怎么办呢?首先说说“属性”的应用,在电脑中,扩展名为.cpl的文件都是属性文件,由控制面板功能调用,主要由Rundll32.exe来运行,在注册表中有关于这一

声明:《thread 属性 thread.sleep》为网友弟大物勃分享!如侵犯到您的合法权益请联系我们删除