[关闭]
@nextleaf 2018-06-08T11:58:05.000000Z 字数 4237 阅读 664

Spring与hibernate整合

1.导包

2.配置数据源

  1. <bean id="sl" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
  2. <property name="dataSource" ref="ds">
  3. <props>
  4. <prop key="dialect">org.hibernate.dialect.Oracle10gDialect</prop>
  5. <prop key="show_sql">true</prop>
  6. <prop key="format_sql">true</prop>
  7. <prop key="">true</prop>
  8. </props>
  9. </property>
  10. <property name="mappingResources">
  11. <list>
  12. <value>com/nl/entity/Cost.hbm.xml</value>
  13. </list>
  14. </property>
  15. </bean>

applicationContext.xml

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans
  3. xmlns="http://www.springframework.org/schema/beans"
  4. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  5. xmlns:aop="http://www.springframework.org/schema/aop"
  6. xsi:schemaLocation="
  7. http://www.springframework.org/schema/beans
  8. http://www.springframework.org/schema/beans/spring-beans-4.1.xsd
  9. http://www.springframework.org/schema/aop
  10. http://www.springframework.org/schema/aop/spring-aop.xsd">
  11. <!-- 配置数据源,并设置连接池 -->
  12. <bean id="ds" class="com.mchange.v2.c3p0.ComboPooledDataSource">
  13. <!-- 设置数据库连接参数 -->
  14. <property name="jdbcUrl" value="jdbc:mysql://localhost:3306/"/>
  15. <property name="driverClass" value="com.mysql.jdbc.Driver"/>
  16. <property name="user" value="root"/>
  17. <property name="password" value="huang"/>
  18. <!-- 设置连接池参数 -->
  19. <property name="initialPoolSize" value="3"/>
  20. <property name="maxPoolSize" value="10"/>
  21. <property name="minPoolSize" value="1" />
  22. <property name="acquireIncrement" value="2"/>
  23. <property name="maxIdleTime" value="60"></property>
  24. </bean>
  25. <!-- 开启组件扫描 -->
  26. <!-- <context:component-scan base-package="com.nl" /> -->
  27. <!-- 配置sessionFactory,代替Hibernate主配置文件 -->
  28. <bean id="sl" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
  29. <property name="dataSource" ref="ds">
  30. <props>
  31. <prop key="dialect">org.hibernate.dialect.MySQLDialect</prop>
  32. <prop key="show_sql">true</prop>
  33. <prop key="format_sql">true</prop>
  34. <prop key="">true</prop>
  35. </props>
  36. </property>
  37. <property name="mappingResources">
  38. <list>
  39. <value>com/nl/entity/Cost.hbm.xml</value>
  40. </list>
  41. </property>
  42. </bean>
  43. <bean id="costDao" class="com.nl.dao.CostDaoImpl">
  44. <property name="sessionFactory" ref="sf"></property>
  45. </bean>
  46. </beans>

声明式事务

(1) 第一种:applicationContext.xml中配置事务,采用AOP形式切入

  1. <!--这里id对应的bean是负责事务控制的方面组件,该组件Spring已经预置了-->
  2. <!--HibernateTransactionManager针对的是Hibernate技术,而org.springframework.jdbc.datasource.DataSourceTransactionManager是针对jdbc技术的方面组件-->
  3. <bean id="txManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
  4. <!--如果使用的是jdbc需要注入dataSource,如果使用的是Hibernate技术需要注入SessionFactory-->
  5. <property name="sessionFactory" ref="sessionFactory"/>
  6. </bean>
  7. <!--通过tx:advice声明了一个通知,制定了什么时候开启什么事务-->
  8. <!--tx:advice指通知,propagation:指事务类型,一般DML(增删该)方法用propagation="REQUIRED",表示开启事务。查询方法用read-only="true",表示不支持事务,效率更高-->
  9. <tx:advice id="txAdvice" transaction-manager="txManager">
  10. <tx:attributes>
  11. <tx:method name="update*" propagation="REQUIRED"/>
  12. <tx:method name="delete*" propagation="REQUIRED"/>
  13. <tx:method name="add*" propagation="REQUIRED"/>
  14. <tx:method name="load*" read-only="true"/>
  15. <tx:method name="execute" propagation="REQUIRED"/>
  16. </tx:attributes>
  17. </tx:advice>
  18. <aop:config proxy-target-class="true">
  19. <!--上面的txAdvice中包含了方面组件txManager,所以可以作用在下面的pointcut的切入点中-->
  20. <aop:advisor advice-ref="txAdvice" pointcut="within(com.qn.action.*)"/>
  21. </aop:config>

(2) 第二种:通过注解配置事务

a,applicationContext-annotation.xml开启组件扫描

  1. <context:component-scan base-package="com.nl" />

b,配置xml声明方面组件(因为方面组件是Spring提供的现成类,如上面的DataSourceTransactionManager或HibernateTransactionManager,所以无法使用注解,只能使用applicationContext-annotation.xml文件配置)

  1. <!--这里id对应的bean是负责事务控制的方面组件,该组件Spring已经预置了-->
  2. <!--org.springframework.orm.hibernate3.HibernateTransactionManager针对的是Hibernate技术,而org.springframework.jdbc.datasource.DataSourceTransactionManager是针对jdbc技术的方面组件-->
  3. <bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
  4. <!--如果使用的是jdbc需要注入dataSource,如果使用的是Hibernate技术需要注入SessionFactory-->
  5. <property name="dataSource" ref="ds"/>
  6. </bean>

c,开启事务注解配置

  1. <!--proxy-target-class="true"指在使用动态代理时,使用cglib的方式-->
  2. <tx:annotation-driven
  3. proxy-target-class="true"
  4. transaction-manager="方面组件的id"/>

d,使用注解配置事务
先将要开启事务的组件声明到Spring容器
@Transactional等价于
@Transactional(propagation=Propagation.REQUIRED)
上面是简写方式
如果不希望方法开启事务
@Transactional(readOnly=true)

注:

@Transactional注解可以加到类上,表示类中所有的方法都按照这种方式控制事务,

@Transactional注解也可以加到方法上,表示当前方法按照这种方式控制事务(那么其他方法可能与当前方法控制事务的方式不一致)

对于声明式事务而言,那么什么时候用注解,什么时候用配置呢?

推荐:
AOP最好用配置(因为配置可以对方面,切入点,通知类型,目标组件都一目了然)

bean的声明可以用注解

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注