整合的目的:1,管理sessionFactory 2,利用声明式事务管理
略。
<!-- 配置SessionFactory-->
<beanid="sessionFactory"class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<propertyname="configLocation"value="classpath:hibernate.cfg.xml"/>
<propertyname="dataSource">
<beanclass="com.mchange.v2.c3p0.ComboPooledDataSource">
<!--数据库连接信息 -->
<propertyname="jdbcUrl"value="${jdbcUrl}"></property>
<propertyname="driverClass"value="${driverClass}"></property>
<propertyname="user"value="${username}"></property>
<propertyname="password"value="${password}"></property>
<!--其他配置信息 -->
<propertyname="initialPoolSize"value="3"></property>
<propertyname="maxPoolSize"value="5"></property>
<propertyname="minPoolSize"value="3"></property>
<propertyname="acquireIncrement"value="2"></property>
<propertyname="maxIdleTime"value="20"></property>
</bean>
</property>
</bean>
<!-- 自动扫描与装配bean -->
<context:component-scanbase-package="cn.itcast"></context:component-scan>
<!-- 配置Hibernate用的事务管理器,需要注入SessionFactory对象 -->
<beanid="transactionManager"class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<propertyname="sessionFactory"ref="sessionFactory"></property>
</bean>
<!-- 采用基于注解的方式配置事务 -->
<tx:annotation-driventransaction-manager="transactionManager"/>
<!-- 配置HibernateTemplate-->
<beanid="hibernateTemplate"class="org.springframework.orm.hibernate3.HibernateTemplate">
<propertyname="sessionFactory"ref="sessionFactory"></property>
</bean>
略
// 在类上声明@Transactional注解,表示所有public方法都需要事务
@Transactional
@Repository("userDao")
publicclass UserDaoImplimplements UserDao {
//注入sessionFactory
@Resource
private SessionFactorysessionFactory;
//一定要使用SessionFactory.getCurrentSession()才可以
publicvoid save(User user) {
sessionFactory.getCurrentSession().save(user);
}
//一定要使用SessionFactory.getCurrentSession()才可以
publicvoid delete(Long id) {
Object obj = getSession().get(User.class, id);
getSession().delete(obj);
}
//一定要使用SessionFactory.getCurrentSession()才可以
//在方法上也定义了@Transactional,设为只读的事务
@Transactional(readOnly =true)
public User getById(Long id) {
return (User) getSession().get(User.class, id);
}
}
这种方式不依赖Spring的API,所以推荐使用。
所用的Session要是sessionFactory.getCurrentSession()得到的。(线程范围内的session,保证事务用的也是这个session)
懒加载问题可以使用OpensessionInViewFilter过滤器完成(延长session的生命至JSP页面解析)