首先,在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参考:HibernateTemplate的使用 - 滥好人 - 博客园,其实templete更方便。