Spring3整合Hibernate3.6之二:用AOP管理事务处理
整合以后可以借助Spring的AOP来管理Hibernate的事务
1.先界定一个事务的边界,这里用的是“ add* ”
2.再把两件事情都放在一个service的操作中,第一件事情执行成功后,第二件事情抛出异常。
3.结果Spring抓取到异常后,把两步操作全都回滚
applicationContext-common.xml中增加以下配置:
其中:expression="execution( * com.rt.sidemo.service.*.*(..)) 定义了此配置具体作用于那个service
其中:<tx:method name="add*" propagation="REQUIRED" rollback-for="java.lang.RuntionException" /> 定义了事务边界和具体处理策略
public void add(Student stu) {//整个add方法是一个事务的边界/* * 正常实例插入后,故意出错抛出 * 此时,连同‘已经’插入的正常实例一起回滚,也就是只要有异常,整部操作回滚 * 证明事务处理时是正确的 */Student stuNew = new Student();//正常实例,这个可以正常插入没问题stuNew.setStudentid(780);stuNew.setName("SH_first");stuNew.setAge(1);studentDAO.addStudent(stuNew);throw new RuntimeException();//故意抛出异常,让事务回滚}
Hibernate自动打印出建表语句,显示实例已经插入成功
之后Spring抓到异常,又把事务边界内 已经成功执行的项目全都回滚
配置事务处理时遇到个小问题:
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'StudentService' defined in file [E:\Java\Workspaces\MyEclipse 10\Spring_Hibernate\bin\com\rt\sidemo\service\StudentService.class]: Initialization of bean failed; nested exception is java.lang.NoClassDefFoundError: org/objectweb/asm/Type
删掉hibernate中的cglib解决的
网上说是hibernate中的cglib和spring的cglib冲突造成的