spring整合hibernate获取currentSession

首先,在spring中配置hibernate的数据源和sessionfactory工厂

<!-- 配置组件扫描器 -->
	<context:component-scan base-package="edu.hrbeu" />

	<!--扫描配置文件(这里指向的是之前配置的那个config.properties) -->
	<context:property-placeholder location="classpath:/config.properties" />

	<!--配置数据源 -->
	<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"
		destroy-method="close">
		<property name="driverClass" value="${jdbc.driver}" />  <!--数据库连接驱动 -->
		<property name="jdbcUrl" value="${jdbc.url}" />     <!--数据库地址 -->
		<property name="user" value="${jdbc.username}" />   <!--用户名 -->
		<property name="password" value="${jdbc.password}" />   <!--密码 -->
		<property name="maxPoolSize" value="40" />      <!--最大连接数 -->
		<property name="minPoolSize" value="1" />       <!--最小连接数 -->
		<property name="initialPoolSize" value="10" />      <!--初始化连接池内的数据库连接 -->
		<property name="maxIdleTime" value="20" />  <!--最大空闲时间 -->
	</bean>

	<!--配置session工厂 ,通过LocalSessionFactoryBean获取线程绑定的session-->
	<bean id="sessionFactory"
		class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
		<property name="dataSource" ref="dataSource" />
		<property name="packagesToScan" value="edu.hrbeu" />
		<property name="hibernateProperties">
			<props>
				<prop key="hibernate.hbm2ddl.auto">${hibernate.hbm2ddl.auto}</prop> <!--hibernate根据实体自动生成数据库表 -->
				<prop key="hibernate.dialect">${hibernate.dialect}</prop>   <!--指定数据库方言 -->
				<prop key="hibernate.show_sql">${hibernate.show_sql}</prop>     <!--在控制台显示执行的数据库操作语句 -->
				<prop key="hibernate.format_sql">${hibernate.format_sql}</prop>     <!--在控制台显示执行的数据哭操作语句(格式) -->
			</props>
		</property>
	</bean>
<!-- 事物管理器配置 -->
	<bean id="transactionManager"
		class="org.springframework.orm.hibernate4.HibernateTransactionManager">
		<property name="sessionFactory" ref="sessionFactory" />
	</bean>

在配置完上述文件后,发现直接掉用getCurrentSession方法会报错:

Could not obtain transaction-synchronized Session for current thread

这时候百度了一下,结果乱七八糟,让配什么的都有,其实只要声明事务就好

<tx:annotation-driven transaction-manager="transactionManager"/>

之后获取hibernate中的currentSession有很多中方法

1.在dao中直接获取


这样直接能获取到,但是对象较多时处理不方便,因此将其提取出来,将其作为静态属性,但是在做静态属性注入时遇到了麻烦,即spring无法直接对静态属性注入,这时候百度了一下,倒是在一个论坛上看到大佬说直接写set方法去掉static进行注入的。即如下:


applicationContext.xml如下:


这样一来便如同单用hibernate一样可以直接调用session.

----------------------------补更-------------------------------------

这样子只能获取到sessionfactory,不能获取到当前线程session,将getsession写为静态是错误的!!!相当低级的错误。。。因此将上述工具类变为


在daoimpl中获取当前sqlsession:


所以直接不能静态获取currentCession,要在每个dao中单独获取,这样线程池为对象分配线程时,才会将session绑定到当前线程上,而静态获取时绑定到了bootstrap线程上,加载完对象时它已结束,所以会报session已关闭的异常。

------------------------------------------------补更完毕-----------------------------------------

2.获取hibernateTemplate


hibernateTemplate参考:https://www.cnblogs.com/hq233/p/6704546.html,其实templete更方便。



猜你喜欢

转载自blog.csdn.net/yinweicheng/article/details/80752910