一、整合Hibernate
1)导入c3p0包、spring-orm包、spring-tx包
2)spring主配置文件applicationContext.xml引入beans、tx、aop约束
3)配置spring配置文件;sessionFactory不用配置绑定线程 否则会报异常
<!-- 配置dataSource --> <bean name="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"> <property name="jdbcUrl" value="jdbc:mysql://localhost:3306/spring?useUnicode=true&characterEncoding=UTF-8&serverTimezone=GMT%2B8&useSSL=true"></property> <property name="driverClass" value="com.mysql.jdbc.Driver"></property> <property name="user" value="root"></property> <property name="password" value="123456"></property> </bean> <!-- 配置sessionFactory --> <bean name="sessionFactory" class="org.springframework.orm.hibernate5.LocalSessionFactoryBean"> <property name="dataSource" ref="dataSource"></property> <property name="hibernateProperties"> <props> <prop key="hibernate.dialect">org.hibernate.dialect.MySQL5InnoDBDialect</prop> <prop key="hibernate.show_sql">true</prop> <prop key="hibernate.format_sql">true</prop> <prop key="hibernate.hbm2ddl.auto">update</prop> <prop key="hibernate.connection.isolation">4</prop> </props> </property> <!-- 配置ORM元数据,会自动扫描该包下的所有配置文件 --> <property name="mappingDirectoryLocations" value="classpath:com/sikiedu/domain"></property> </bean>
4)配置Dao层并注入sessionFactory
<!-- 配置Dao --> <bean name="userDao" class="com.sikiedu.dao.UserDao"> <property name="sessionFactory" ref="sessionFactory"></property> </bean>
5)Dao层继承HibernateDaoSupport类,使用getHibernateTemplate()方法获取Session
package com.sikiedu.dao; import org.hibernate.Session; import org.hibernate.Transaction; import org.hibernate.query.NativeQuery; import org.springframework.orm.hibernate5.HibernateTemplate; import org.springframework.orm.hibernate5.support.HibernateDaoSupport; import com.sikiedu.domain.User; public class UserDao extends HibernateDaoSupport { public User findUser(User user) { Session session = getHibernateTemplate().getSessionFactory().getCurrentSession(); // Session session = HibernateUtils.getCurrentSession(); String sql = "SELECT * FROM user WHERE username = ? AND password = ?"; NativeQuery<User> sqlQuery = session.createSQLQuery(sql); sqlQuery.setParameter(1, user.getUsername()); sqlQuery.setParameter(2, user.getPassword()); sqlQuery.addEntity(User.class); User temp = sqlQuery.uniqueResult(); return temp; } }
二、SpringAOP事务配置 - HibernateTransactionManager
1)applicationContext.xml配置
配置织入:将上面的通知织入到目标对象
<!-- 配置Hibernate事务的核心管理器 - 依赖于连接池 --> <bean name="transactionManager" class="org.springframework.orm.hibernate5.HibernateTransactionManager"> <property name="sessionFactory" ref="sessionFactory"></property> </bean> <!-- 配置通知 --> <tx:advice id="advice" transaction-manager="transactionManager"> <tx:attributes> <tx:method name="*"/><!-- *匹配所有方法 --> </tx:attributes> </tx:advice> <!-- 配置织入:将通知织入到目标对象 --> <aop:config> <!-- 配置切点表达式 --><!-- * com.sikiedu.service.*.*(..)表示com.sikiedu.*.*包下的所有类的所有方法;(..)表示方法参数可有可无--> <aop:pointcut expression="execution(* com.sikiedu.service.*.*(..))" id="pointcut"/>
<!-- 配置切面(通知+切点) -->
<aop:advisor advice-ref="advice" pointcut-ref="pointcut"/> </aop:config>
2)配置web.xml,扩大Session范围
<filter> <filter-name>openSession</filter-name> <filter-class>org.springframework.orm.hibernate5.support.OpenSessionInViewFilter</filter-class> </filter> <filter-mapping> <filter-name>openSession</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
3)service层使用 - aop增强,自动使用事务
package com.sikiedu.service; import com.sikiedu.dao.UserDao; import com.sikiedu.domain.User; public class UserService { private UserDao userDao; public User findUser(User user) { User temp = null; temp = userDao.findUser(user); return temp; } public UserDao getUserDao() { return userDao; } public void setUserDao(UserDao userDao) { this.userDao = userDao; } }