spring的事务管理可以编码,也可声明!推荐声明!
1、添加spring、hibernate支持
myeclipse9.0直接支持spring3.0和hibernate3.3
2、创建spring装配文件(applicationContext.xml)
下图勾选bean 、aop、tx三项。
3、配置内容:
1)装配数据源和工厂
<bean id="dataSource"
class="org.apache.commons.dbcp.BasicDataSource">
<property name="driverClassName"
value="com.mysql.jdbc.Driver">
</property>
<property name="url" value="jdbc:mysql://localhost/newsdb?characterEncoding=utf8"></property>
<property name="username" value="root"></property>
<property name="password" value="123456"></property>
</bean>
<bean id="sessionFactory"
class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="dataSource">
<ref bean="dataSource" />
</property>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">
org.hibernate.dialect.MySQLDialect
</prop>
<prop key="show_sql">true</prop>
</props>
</property>
<property name="mappingResources">
<list>
<value>mapping.xml</value>
</list>
</property>
</bean>
2)装配事务管理
<!-- 配置事务管理器 -->
<bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory">
<ref bean="sessionFactory"/>
</property>
</bean>
3)装配事务属性
<!-- 配置事务传播特性 -->
<tx:advice id="TestAdvice" transaction-manager="transactionManager">
<tx:attributes>
<tx:method name="add*" propagation="REQUIRED"/>
<tx:method name="del*" propagation="REQUIRED"/>
<tx:method name="update*" propagation="REQUIRED"/>
<tx:method name="add*" propagation="REQUIRED"/>
<tx:method name="find*" propagation="REQUIRED"/>
<tx:method name="get*" propagation="REQUIRED"/>
<tx:method name="apply*" propagation="REQUIRED"/>
</tx:attributes>
</tx:advice>
4)确定切面,需要使用事务的bean
<!-- 配置参与事务的类 -->
<aop:config>
<aop:pointcut id="allTestServiceMethod" expression="execution(* manager.*.*(..))"/>
<aop:advisor pointcut-ref="allTestServiceMethod" advice-ref="TestAdvice" />
</aop:config>
5)常规bean可以配到另外的装配文件中
<bean id="bookManager" class="manager.BookManager" >
<property name="hibernateTemplate">
<ref bean="hibernateTemplate" />
</property>
</bean>
如果bean中不使用hibernateTemplate,可以不注入此对象
<bean id="hibernateTemplate" class="org.springframework.orm.hibernate3.HibernateTemplate" >
<property name="sessionFactory">
<ref local="sessionFactory" />
</property>
</bean>
4、测试对象
业务实体 BookManager.java
public class BookManager implements BookManagerInterface{
private Book book;
private Address addrss;
private HibernateTemplate hibernateTemplate;
public void setHibernateTemplate(HibernateTemplate hibernateTemplate) {
this.hibernateTemplate = hibernateTemplate;
}
public void addBook(Book b,Address a){
hibernateTemplate.save(b);
Integer.parseInt("d");
hibernateTemplate.save(a);
}
}
测试类
TestBookManager .java
public class TestBookManager {
public static void main(String[] args) {
// TODO Auto-generated method stub
String cfg[]=new String[]{"src\\hibernateSpring.xml",
"src\\commonbean.xml"
};
ApplicationContext ac =new FileSystemXmlApplicationContext(cfg);
BookManagerInterface bmi=(BookManagerInterface) ac.getBean("bookManager");
System.out.println(bmi.getClass().getName());
Book b =new Book();
b.setName("spring aop");
Address a =new Address();
a.setCity("天津");
bmi.addBook(b, a);
}
}
5、事务的传递性说明
PROPAGATION_REQUIRED--支持当前事务,如果当前没有事务,就新建一个事务。这是最常见的选择,没特殊性需求,这个足矣。
PROPAGATION_SUPPORTS--支持当前事务,如果当前没有事务,就以非事务方式执行。
PROPAGATION_MANDATORY--支持当前事务,如果当前没有事务,就抛出异常。
PROPAGATION_REQUIRES_NEW--新建事务,如果当前存在事务,把当前事务挂起。
PROPAGATION_NOT_SUPPORTED--以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。
PROPAGATION_NEVER--以非事务方式执行,如果当前存在事务,则抛出异常。
PROPAGATION_NESTED--如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则进行与PROPAGATION_REQUIRED类似的操作。