您的位置:首页 > 编程语言 > Java开发

使用Spring-Aop实现Hibernate事务管理

2008-10-07 20:32 387 查看
1.当你发现一些方法同时需求某项共同的功能时那么,你应该想到的是Aop。面向方面,把共同的功能以方面的形式切入方法中

术语:

advice,advisor,intercepter-我一般都把他们理解成拦截器

point-cut 即为我们需要切入方面的点。

2.在ssh开发当中,我们把业务放在struts的Action当中,我们同时希望事务控制也能在业务当中,所以我们可以对dao的实现方法切入我们的方面。

下面是我的配置文件,带你简单了解下spring配置Hibernate的事务:

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">

<beans>

<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:3306/mldn"></property>

<property name="username" value="root"></property>

<property name="password" value="yudylaw"></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="hibernate.show_sql">true</prop>

<prop key="hibernate.connection.autocommit">false</prop>

</props>

</property>

<property name="mappingResources">

<list>

<value>yudylaw/tran/vo/Tran.hbm.xml</value>

</list>

</property>

</bean>

<bean id="transactionManager"

class="org.springframework.orm.hibernate3.HibernateTransactionManager">

<property name="sessionFactory">

<ref local="sessionFactory"/>

</property>

</bean>

<bean id="trandaoimplTarget" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">

<property name="transactionManager">

<ref local="transactionManager"/>

</property>

<property name="target">

<ref local="trandaoimpl"/>

</property>

<property name="transactionAttributes">

<props>

<prop key="add*">PROPAGATION_REQUIRED,-Exception</prop>

</props>

</property>

</bean>

<bean id="hibernateTemplate" class="org.springframework.orm.hibernate3.HibernateTemplate">

<property name="sessionFactory">

<ref bean="sessionFactory"/>

</property>

</bean>

<bean id="trandao" class="yudylaw.tran.DAO.TranDAO" abstract="true">

</bean>

<bean id="trandaoimpl" class="yudylaw.tran.DAOImpl.TranDAOImpl" parent="trandao">

<property name="hibernateTemplate">

<ref bean="hibernateTemplate"/>

</property>

</bean>

<bean name="/tran" class="yudylaw.tran.struts.action.TranAction">

<property name="trandao">

<ref bean="trandaoimplTarget"/>

</property>

</bean>

</beans>

TranAction的核心代码:

public ActionForward execute(ActionMapping mapping, ActionForm form,

HttpServletRequest request, HttpServletResponse response) {

try {

Tran tran = new Tran(11004,"andy");

this.trandao.addTran(tran);

System.out.println("自动提交才对");

//自动提交

} catch (Exception e) {

System.out.println("应该回滚才对");

//自动回滚

e.printStackTrace();

}

return null;

}

这样Hibernate的事务就代理成功了,只要trandao的add*方法抛出异常,那么事务会自动回滚。

几点注意的地方:
target属性:就是目标对象,既是被代理对象,这里是trandaoimpl
hibernate的自动提交一定得关掉

<bean name="/tran" class="yudylaw.tran.struts.action.TranAction">

<property name="trandao">

<ref bean="trandaoimplTarget"/>

</property>

</bean>

这里trandao的参考bean应该是代理对象,这样事务拦截器就切入了trandaoimpl方法,实现了代理功能。

AOP的实际方向应该是:代理对象---->拦截器--->目标对象--->拦截器 (拦截器可以为多个,这里只有一个拦截器)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: