编程式事务:通过编码的方式,让事务处理的代码侵入到核心的业务代码中。

声明式事务:完成了事务处理的代码和业务核心代码的解耦合。提供事务处理代码的复用性和降低维护成本。

声明式事务:aop最典型的应用。

使用动态代理实现事务的管理:

Jdk: 实现动态是通过实现某个特定的接口(代理类和目标类必须是相同的接口),产生一个虚拟的class文件(代理类的)。必须有接口的实现才能使用jdk完成动态代理

Cglib:动态代理,如果没有接口的实现使用cglib完成动态代理,使用了一个asm框架,完成某个类(目标类)的子类(虚拟的class文件)

Hibernate,spring 使用jdk的动态代理(默认情况),也可以使用cglig

1 新建java项目

进行spring+hibernate的集成:

使用IOC进行对象管理和注入

使用AOP进行事务的管理

2加入jar包

Spring的jar包

Hibernate的jar包

Dbcp的数据库连接池包(c3p0)

3 建立配置文件

在src目录下:

Hibernate.cfg.xml

applicationContext.xml

hibernate配置文件的内容:

 <?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<!-- 数据库的运行环境 -->
<property name="connection.driver_class">
com.mysql.jdbc.Driver
</property>
<property name="connection.url">
jdbc:mysql://localhost:3306/ssh
</property>
<property name="connection.username">root</property>
<property name="connection.password">root</property>
<!-- 数据库方言 -->
<property name="dialect">
org.hibernate.dialect.MySQLDialect
</property>
<!-- hiberante 其他的属性 -->
<property name="show_sql">true</property>
<property name="format_sql">true</property>
<property name="hbm2ddl.auto">update</property>
<!-- 加载映射文件 -->
<mapping resource="org/guangsoft/pojo/Student.hbm.xml" />
</session-factory>
</hibernate-configuration>

4建立Dao接口

 package org.guangsoft.dao;
import org.guangsoft.pojo.Student;
/***
* StudentDao接口
* **/
public interface StudentDao
{
public void addStudent(Student stu);
}

5建立Dao接口的实现类

 package org.guangsoft.dao.impl;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
import org.guangsoft.dao.StudentDao;
import org.guangsoft.pojo.Student;
/***
* StudentDao接口的实现类,完成数据库的访问
* HibernateDaoSupport:是spring完成对hibernate的支持
* private HibernateTemplate hibernateTemplate;用来完成数据的crud操作
* 给HibernateDaoSupport注入sessoinFactory
* super.getSession();获得hibernate原始的session对象
* ***/
public class StudentDaoImpl extends HibernateDaoSupport
implements StudentDao
{
/***
* 添加学生信息
* ***/
@Override
public void addStudent(Student stu)
{
super.getHibernateTemplate().save(stu);
}
}

6 建立service接口

 package org.guangsoft.service;
import org.guangsoft.pojo.Student;
/** 建立用户service接口 ***/
public interface StudentService
{
public void saveUser(Student stu);
}

7 建立service接口的实现类

 package org.guangsoft.service.impl;
import org.guangsoft.dao.StudentDao;
import org.guangsoft.pojo.Student;
import org.guangsoft.service.StudentService;
public class StudentServiceImpl implements StudentService
{
// 声明dao对象
private StudentDao studentDao;
public void setStudentDao(StudentDao studentDao)
{
this.studentDao = studentDao;
}
@Override
public void saveUser(Student stu)
{
studentDao.addStudent(stu);
}
}

8进行spring的配置

 <?xml version="1.0" encoding="UTF-8"?>
<!-- 到入xml文件的约束 -->
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:aop="http://www.springframework.org/schema/aop" xmlns:p="http://www.springframework.org/schema/p"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.1.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-4.1.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-4.1.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-4.1.xsd
">
<!-- 实例化一个SessionFactory -->
<bean id="sessionFactory"
class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<!-- 加载hibernate的配置文件 -->
<property name="configLocation" value="classpath:hibernate.cfg.xml"></property>
</bean>
<!-- 实例Dao对象 -->
<bean id="studentDao" class="org.guangsoft.dao.impl.StudentDaoImpl">
<!-- 注入sessionFactory -->
<property name="sessionFactory" ref="sessionFactory"></property>
</bean>
<!-- 实例化service对象 -->
<bean id="studentService" class="org.guangsoft.service.impl.StudentServiceImpl">
<!-- 注入dao对象 -->
<property name="studentDao" ref="studentDao"></property>
</bean>
<!-- 声明式事务:进行事务的配置 -->
<!-- 1 实例化事务管理器对象 -->
<bean id="transactionManager"
class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<!-- 注入sessionFactory -->
<property name="sessionFactory" ref="sessionFactory"></property>
</bean>
<!-- 2 进行事务特征的声明: 切面 id:用来完成切面在其他地方引用 transaction-manager:引用事务管理器对象 -->
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<tx:attributes>
<!-- name:声明的是将哪些命名规范的方法,纳入事务管理 propagation:事务传播机制。 PROPAGATION_REQUIRED:
如果存在一个事务,则支持当前事务。如果没有事务则开启 isolation:事务的隔离级别,是数据库平台默认的隔离级别 read-only:被刺事务操作的数据是只读的
rollback-for=:异常的完全限定名,如果发生这样的异常进行回滚 -->
<tx:method name="add*" propagation="REQUIRED" isolation="DEFAULT" />
<tx:method name="save*" propagation="REQUIRED" isolation="DEFAULT" />
<tx:method name="update*" propagation="REQUIRED" isolation="DEFAULT" />
<tx:method name="delete*" propagation="REQUIRED" isolation="DEFAULT" />
<tx:method name="modf*" propagation="REQUIRED" isolation="DEFAULT" />
<tx:method name="get*" propagation="REQUIRED" isolation="DEFAULT"
read-only="true" />
<tx:method name="select*" propagation="REQUIRED" isolation="DEFAULT"
read-only="true" />
</tx:attributes>
</tx:advice>
<!-- 3进行AOP的配置 -->
<aop:config>
<!-- 声明切入点 -->
<aop:pointcut expression="execution(* org.guangsoft.service.impl.*.*(..))"
id="pc" />
<!-- 进行织入 -->
<aop:advisor advice-ref="txAdvice" pointcut-ref="pc" />
</aop:config>
</beans>

9添加事务的测试

 package org.guangsoft.test;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.guangsoft.pojo.Student;
import org.guangsoft.service.StudentService;
public class TransactionTest
{
@Test
public void testTransaction()
{
// 加载spring的配置文件,获得bean容器
ApplicationContext ac = new
ClassPathXmlApplicationContext("applicationContext.xml");
// 获得bean对象
StudentService studentService = (StudentService) ac
.getBean("studentService");
Student stu = new Student();
stu.setSname("小强");
studentService.saveUser(stu);
}
}

1 实例化事务管理器对象

2 声明事务切面(事务的特征)

3 进行aop的配置

声明式事务-整合Spring、Hibernate的更多相关文章

  1. 使用spring声明式事务,spring使用AOP来支持声明式事务,会根据事务属性,自动在方法调用之前决定是否开启一个事务,并在方法执行之后决定事务提交或回滚事务。

    使用spring声明式事务,spring使用AOP来支持声明式事务,会根据事务属性,自动在方法调用之前决定是否开启一个事务,并在方法执行之后决定事务提交或回滚事务.

  2. 【声明式事务】Spring声明式事务实现(三)

    以MyBatis为例. 一.基于注解的声明式事务配置 1. 添加tx名字空间 xmlns:tx="http://www.springframework.org/schema/tx" ...

  3. 【声明式事务】Spring事务介绍(一)

    事务管理对于企业应用来说是至关重要的,当出现异常情况时,它也可以保证数据的一致性. Spring事务有两种管理方式:编程式事务和声明式事务 编程式事务使用TransactionTemplate或者直接 ...

  4. 【声明式事务】Spring事务特性(二)

    spring所有的事务管理策略类都继承自org.springframework.transaction.PlatformTransactionManager接口. 其中TransactionDefin ...

  5. 声明式事务xml Spring

    !--JDBC事务管理器--><bean id="tansactionManager" class="org.springframework.jdbc.dat ...

  6. 【spring 7】spring和Hibernate的整合:声明式事务

    一.声明式事务简介 Spring 的声明式事务管理在底层是建立在 AOP 的基础之上的.其本质是对方法前后进行拦截,然后在目标方法开始之前创建或者加入一个事务,在执行完目标方法之后根据执行情况提交或者 ...

  7. 全面分析 Spring 的编程式事务管理及声明式事务管理

    开始之前 关于本教程 本教程将深入讲解 Spring 简单而强大的事务管理功能,包括编程式事务和声明式事务.通过对本教程的学习,您将能够理解 Spring 事务管理的本质,并灵活运用之. 先决条件 本 ...

  8. 全面分析 Spring 的编程式事务管理及声明式事务管理--转

    开始之前 关于本教程 本教程将深入讲解 Spring 简单而强大的事务管理功能,包括编程式事务和声明式事务.通过对本教程的学习,您将能够理解 Spring 事务管理的本质,并灵活运用之. 先决条件 本 ...

  9. spring事务管理——编程式事务、声明式事务

    本教程将深入讲解 Spring 简单而强大的事务管理功能,包括编程式事务和声明式事务.通过对本教程的学习,您将能够理解 Spring 事务管理的本质,并灵活运用之. 先决条件 本教程假定您已经掌握了 ...

随机推荐

  1. 重温javascript事件机制

    以前用过一段时间的jquery感觉太方便,太强大了,各种动画效果,dom事件.创建节点.遍历.控件及UI库,应有尽有:开发文档也很多,网上讨论的问题更是甚多,种种迹象表明jquery是一个出色的jav ...

  2. 随鼠标移动tab

    <script language="javascript">         function tabChange(obj, id) {             var ...

  3. jquery mobile cannot be created in a document with origin 'null' and URL

    jquery mobile cannot be created in a document with origin 'null' and URL http://zhidao.baidu.com/lin ...

  4. “北航Clubs”功能规格说明书

    1.项目目标说明: 北航Clubs的初衷是服务社团,服务学生,满足社团与学生的信息互通的需求.社团管理运营方便的需求. 建设网站的目的是使学生可以在一个权威可信的网站上获取到社团实时的动态,社团活动的 ...

  5. CentOS 6.5安装Apache

    1.Apache的特点 功能强大.配置简单.速度快.应用广泛.性能稳定可靠,并可做代理服务器或负载均衡来使用 2.Apache的应用场合 使用Apache运行静态HTML网页.图片(处理静态小文件能力 ...

  6. [Unity3d][NGUI]打包NGUI预制件成Assetbundle 两种思路.

    http://www.58player.com/blog-2537-85030.html 接上文,项目中因为需要UI热更新,所以我使用了AssetBundle这个解决方案.               ...

  7. 《C和指针(Pointer on c)》 学习笔记(转自:http://dsqiu.iteye.com/blog/1687944)

    首先本文是对参考中三个连接的博客进行的整理,非常感谢三位博主的努力,每次都感叹网友的力量实在太强大了…… 第一章 快速上手 1.  在C语言中用/*和*/来注释掉这段代码,这个实际上并不是十分的安全, ...

  8. 【原创】ReFlux细说

    ReFlux细说 Flux作为一种应用架构(application architecture)或是设计模式(pattern),阐述的是单向数据流(a unidirectional data flow) ...

  9. fastx_toolkit去除测序数据中的接头和低质量的reads

    高通量测序数据下机后得到了fastq的raw_data,通常测序公司在将数据返还给客户之前会做"clean"处理,即得到clean_data.然而,这些clean_data是否真的 ...

  10. Python检验一个文件是否存在,如果不在就自己填写内容。

    import os while True: filename=input('Please enter the filename') if os.path.exists(filename): print ...