`

[SXT][WY]Spring08 事务

阅读更多

===============  采用编程式事务 =====================

 

引入这个机制的情况:系统日志在hibernate存入数据库的时候,涉及到 tbluser 和 tbllog 两个表。这两个表要么同时存入数据,要么同时不存入。所以把这两个表的操作 放到一个事务中。

 

(系统日志 区别与 编程常用的 调试日志,调试日志 是输出到文件或者控制台 的。他们的作用也不一样)

 

本例子中,和之前hibernate的例子比较,改动地方如下(本例子中,没有涉及到spring):

 

a、hibernate.cfg.xml

<!DOCTYPE hibernate-configuration PUBLIC
    "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
    "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">

<hibernate-configuration>
    <session-factory>
        <property name="hibernate.connection.url">jdbc:mysql://localhost/spring_hibernate_1</property>
        <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
        <property name="hibernate.connection.username">root</property>
        <property name="hibernate.connection.password">bjsxt</property>
        <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
        <property name="hibernate.show_sql">true</property>
        <property name="hibernate.current_session_context_class">thread</property>
        <!--
        <property name="hibernate.current_session_context_class">jta</property>
         -->       

        <mapping resource="com/bjsxt/usermgr/model/User.hbm.xml"/>
        <mapping resource="com/bjsxt/usermgr/model/Log.hbm.xml"/>
    </session-factory>
</hibernate-configuration>

 

b、UserManagerImpl.java

import java.util.Date;
import org.hibernate.Session;
import com.bjsxt.usermgr.model.Log;
import com.bjsxt.usermgr.model.User;
import com.bjsxt.usermgr.util.HibernateUtils;

public class UserManagerImpl implements UserManager {

    public void addUser(User user) {
        Session session = null;
        try {
            //session = HibernateUtils.getSession();

            // 下面这句话的含义是,拿到当前线程中的session
            session = HibernateUtils.getSessionFactory().getCurrentSession();

            session.beginTransaction();
            // 这里保存,既 完成了 本事物的一半的任务
            session.save(user);

            //Integer.parseInt("asdfsdfsfsd"); // 这句话 做回滚实验用
            Log log = new Log();
            log.setType("安全日志");
            log.setDetail("xxx进入系统");
            log.setTime(new Date());

            LogManager logManager = new LogManagerImpl();

            // 这里调用保存, 完成 本 事务的另一半任务
            logManager.addLog(log);

            session.getTransaction().commit();
        }catch(Exception e) {
            e.printStackTrace();
            session.getTransaction().rollback();
//        }finally {
//            HibernateUtils.closeSession(session);

        }
    }
}

 

LogManagerImpl.java

import com.bjsxt.usermgr.model.Log;
import com.bjsxt.usermgr.util.HibernateUtils;

public class LogManagerImpl implements LogManager {

    public void addLog(Log log) {

        // 这里拿到的session 是 和 上面的 一样的session
        HibernateUtils.getSessionFactory().getCurrentSession() .save(log);
    }

}

 

下面是 视频 中的总结:

 

1、getCurrentSession()与openSession()的区别?
    * 采用getCurrentSession()创建的session会绑定到当前线程中,而采用openSession()
      创建的session则不会
    * 采用getCurrentSession()创建的session在commit或rollback时会自动关闭,而采用openSession()
      创建的session必须手动关闭
     
2、使用getCurrentSession()需要在hibernate.cfg.xml文件中加入如下配置:
    * 如果使用的是本地事务(jdbc事务)
    <property name="hibernate.current_session_context_class">thread</property>
    * 如果使用的是全局事务(jta事务)
    <property name="hibernate.current_session_context_class">jta</property>      

 

 

===============  采用声明式事务 =====================

 

编写业务逻辑方法:
    * 继承HibernateDaoSupport类,使用HibernateTemplate来持久化,HibernateTemplate是
      Hibernate Session的轻量级封装
    * 默认情况下运行期异常 才会回滚(包括继承了RuntimeException子类),普通异常 是不会滚的
    * 编写业务逻辑方法时,最好将异常一直向上抛出,在表示层(struts)处理
    * 关于事务边界的设置,通常设置到业务层 ,不要添加到Dao上 

 

相关的类如下:

UserManagerImpl.java(这个类可以理解为BO,实现业务逻辑。对象的保存功能应该放到DAO中,这里直接存是为了方便)

import java.util.Date;

import org.hibernate.Session;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;

import com.bjsxt.usermgr.model.Log;
import com.bjsxt.usermgr.model.User;
import com.bjsxt.usermgr.util.HibernateUtils;

public class UserManagerImpl extends HibernateDaoSupport implements UserManager {
   
    private LogManager logManager;
   
    public void addUser(User user) {
        this.getHibernateTemplate().save(user); // 在这个方法调用之前,就已经启动了 事务
        Log log = new Log();
        log.setType("安全日志");
        log.setDetail("xxx进入系统");
        log.setTime(new Date());
        logManager.addLog(log); // 这个方法中存储动作,使用的是一个事务
        throw new java.lang.RuntimeException();
    }

 

/*  这里是 通过抛出异常 做 回滚 测试

public void addUser(User user)
    throws Exception {
        this.getHibernateTemplate().save(user);
        Log log = new Log();
        log.setType("安全日志");
        log.setDetail("xxx进入系统");
        log.setTime(new Date());
        logManager.addLog(log);
        throw new Exception();
    }*/


    public void setLogManager(LogManager logManager) {
        this.logManager = logManager;
    }
}

 

LogManagerImpl.java

import org.springframework.orm.hibernate3.support.HibernateDaoSupport;

import com.bjsxt.usermgr.model.Log;
import com.bjsxt.usermgr.util.HibernateUtils;

public class LogManagerImpl extends HibernateDaoSupport implements LogManager {

    public void addLog(Log log) {
        this.getHibernateTemplate().save(log);
    }
}

 

Client.java

import org.springframework.beans.factory.BeanFactory;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import com.bjsxt.usermgr.manager.UserManager;
import com.bjsxt.usermgr.manager.UserManagerImpl;
import com.bjsxt.usermgr.model.User;

public class Client {

    public static void main(String[] args) {
        User user = new User();
        user.setName("张三");
        // 注意这里的写法
        BeanFactory factory = new ClassPathXmlApplicationContext("applicationContext-*.xml");

        UserManager userManager = (UserManager)factory.getBean("userManager");
        try {
            userManager.addUser(user);
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}

spring的配置文件 按照功能 分两块写,

applicationContext-Common.xml

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

<beans xmlns="http://www.springframework.org/schema/beans"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xmlns:aop="http://www.springframework.org/schema/aop"
         xmlns:tx="http://www.springframework.org/schema/tx"
         xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
           http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.0.xsd
           http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.0.xsd">
    <!-- 配置sessionFactory -->
    <bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
        <property name="configLocation">
            <value>classpath:hibernate.cfg.xml</value>   // 这里的 hibernate配置,在另外一个文件中
        </property>   
    </bean>   
       
   
    <!-- 配置事务管理器 -->
    <bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
        <property name="sessionFactory">
            <ref bean="sessionFactory"/>
        </property>   
    </bean>
   
    <!-- 配置事务的传播特性 -->
    <tx:advice id="txAdvice" transaction-manager="transactionManager">
        <tx:attributes>
            <tx:method name="add*" propagation="REQUIRED"/> // 其他类型的 传播特性 很少用到
            <tx:method name="del*" propagation="REQUIRED"/>
            <tx:method name="modify*" propagation="REQUIRED"/>
            <tx:method name="*" read-only="true"/> //意思是 除了上面三个方法外,其他方法都是”只读“,这样就不用开启 事务 , 可以提高运行效率。
        </tx:attributes>
    </tx:advice>

   
    <!-- 那些类的哪些方法参与事务 -->
    <aop:config>
        <aop:pointcut id="allManagerMethod" expression="execution(* com.bjsxt.usermgr.manager.*.*(..))"/>
        <aop:advisor pointcut-ref="allManagerMethod" advice-ref="txAdvice"/>
    </aop:config>
</beans>

 

 

applicationContext-beans.xml

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

<beans xmlns="http://www.springframework.org/schema/beans"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xmlns:aop="http://www.springframework.org/schema/aop"
         xmlns:tx="http://www.springframework.org/schema/tx"
         xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
           http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.0.xsd
           http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.0.xsd">
   
    <bean id="userManager" class="com.bjsxt.usermgr.manager.UserManagerImpl">
        <property name="sessionFactory" ref="sessionFactory"/>
        <property name="logManager" ref="logManager"/>
    </bean>
   
    <bean id="logManager" class="com.bjsxt.usermgr.manager.LogManagerImpl">
        <property name="sessionFactory" ref="sessionFactory"/>
    </bean>
</beans>

分享到:
评论

相关推荐

    Spring 3.0 新特性

    **Spring 3.0新特性详解** Spring框架作为Java企业级应用开发的基石,自发布...文件`SXT_Spring3_02`和`SXT_Spring3_01`可能涵盖了Spring 3.0的基础概念和使用方法,对于深入理解和使用这个版本的Spring框架至关重要。

    spring AOP配置的几种方式

    &lt;bean id="productImpl" class="com.sxt.spring.model.impl.ProductImpl" /&gt; &lt;bean id="userImpl" class="com.sxt.spring.model.impl.UserImpl" /&gt; &lt;!-- 通知对象Advice --&gt; &lt;bean id="afterAdvice" class="com.sxt...

    sxt Video File

    【sxt Video File】是一种专为视频开发设计的文件格式,它被广泛应用于多媒体内容的存储和传输。这种格式可能包含一系列技术规格和编码标准,旨在优化视频质量和压缩效率,同时便于开发人员进行集成和处理。在【描述...

    sxt.rar_sxt

    标题 "sxt.rar_sxt" 暗示我们正在处理一个RAR压缩文件,其中包含一个名为"sxt"的项目。这个文件很可能是一个使用Visual C++(VC++)编写的程序,目的是实现无须额外驱动就能访问和操作摄像头的功能。在Windows环境中...

    SXT--RBAC权限控制系统源码

    《SXT--RBAC权限控制系统源码解析》 在信息技术领域,权限控制是系统安全的重要组成部分,它确保了用户只能访问他们被授权的资源。本文将深入探讨SXT--RBAC(Role-Based Access Control,基于角色的访问控制)权限...

    mikrotik SXT 网桥点对点安装

    在进行mikrotik SXT网桥点对点安装时,我们首先需要了解网桥设备以及点对点连接的定义。网桥是一种网络设备,主要用于连接两个或多个局域网(LAN)段,允许不同网络段中的设备相互通信。在无线通信领域,点对点...

    11spring4_aop3.rar

    &lt;beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop" xsi:schemaLocation=...

    SXT_ksxt_

    很抱歉,但根据您给出的信息,标题"‘SXT_ksxt_’"和描述"‘加热后软件恶霸vi热v贵部 将二姑vUI热 进欧冠ire’"似乎包含了一些难以理解的词汇,它们可能不是标准的IT术语或者描述。标签"‘ksxt’"看起来像是简写或...

    08spring4_dynamicproxy.rar

    package cn.sxt.dynamicproxy; import java.util.ArrayList; import java.util.List; import cn.sxt.service.UserService; import cn.sxt.service.UserServiceImpl; public class Client { public ...

    SXT shell_SXTshell_

    【SXT Shell:一个自动化安装脚本的探索】 在IT行业中,自动化是提高效率的关键,尤其是在服务器管理和维护中。SXT Shell(SXTshell)是一个专门为实现自动化部署和配置而设计的脚本工具。它旨在简化系统管理员的...

    struts2+spring+hibernate s2sh结合方式框架搭建开发

    此外,Spring的事务管理可以在Service层的方法上添加@Transactional注解,实现事务的自动管理。 在实际开发中,S2sh-sxt可能包含了示例项目的所有源码、配置文件、数据库脚本以及相关的文档。开发者可以参考这些...

    sxt\weblogic\weblogic安装.avi

    sxt\weblogic\weblogic安装.avi sxt\weblogic\weblogic安装.avisxt\weblogic\weblogic安装.avi sxt\weblogic\weblogic安装.avi

    05spring4_di.rar

    &lt;beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p" xmlns:c=...

    sxt_api_14.jar

    sxt_api_14.jar,便于下载可以使用

    sxt66329PPT模板.pptx

    "sxt66329PPT模板.pptx" 是一款商务用途的PPT模板,适用于各类专业场合。 1. **模板选择与定制**: - 商务模板通常采用简洁、专业且色彩协调的设计,以符合商业环境的正式氛围。"sxt66329" 模板可能包含一系列预设...

    sxt+doswin1.zip

    正是在这种背景下,刘经理推荐的“sxt+doswin1.zip”压缩包显得尤为珍贵。这个压缩包中包含了两个软件工具,它们分别是SXTPSGJ_V2.1_XiTongZhiJia和doswin1,两者结合使用,为工程师们提供了一个在DOS环境下进行图像...

    sxt.zip_VBa_摄像头

    标题 "sxt.zip_VBa_摄像头" 暗示了这个压缩包可能包含一个使用VBA(Visual Basic for Applications)编程实现的工具或代码,用于访问和操作摄像头。VBA是一种脚本语言,广泛应用于Microsoft Office套件中,如Excel、...

    sxt.rar_c#扇形图

    本资源"**sxt.rar_c#扇形图**"提供了一段代码,可以帮助开发者自定义绘制扇形统计图。 在C#中,我们可以利用GDI+(Graphics Device Interface Plus)库来实现图形绘制,包括扇形图。GDI+是.NET Framework的一部分,...

    sxt.rar_c# 摄像头实例

    标题 "sxt.rar_c# 摄像头实例" 提供了一个关于使用C#编程语言进行摄像头控制的项目实例。这个实例可能是一个基础的、可运行的代码示例,用于展示如何在C#环境中访问和操作摄像头设备。下面将详细讨论C#中摄像头控制...

Global site tag (gtag.js) - Google Analytics