spring3.0.3+hibernate3.5.4+JOTM2.2.1实现JTA事务管理

2023-11-18

本文参考资料:http://java.e800.com.cn/articles/2007/417/1176746498587392322_1.html

 

实验方法:本文设置两个entity(Topic对应test1数据库, Post对应test2数据库 ),在事务处理中,如果不抛异常,就分别往Topic与Post所对应数据库的表添加一条记录;如果抛异常,则两个数据库的表不添加记录。

 

注:spring3.0.3关于事务的jar包中去掉了原来有的JotmFactoryBean.class,我从2.5.5版本中拷贝到3.0.3中使用。

 

Topic的类定义以下映射文件如下:

 

package entity;
public class Topic {

    private long oid;
    private String name;
    private int flat;


    public long getOid() {return oid;}
    public void setOid(long oid) {this.oid = oid;}
    public String getName() {return name;}
    public void setName(String name) {this.name = name;}
    public int getFlat() {return flat;}
    public void setFlat(int flat) {this.flat = flat;}
}

 

<?xml version="1.0" encoding="UTF-8"?>
 
<!DOCTYPE hibernate-mapping PUBLIC 
"-//Hibernate/Hibernate Mapping DTD 3.0//EN" 
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="entity">
    <class name="Topic" table="TOPIC">
           <id name="oid" column="oid" type="long">
               <generator class="native"/>
          </id>
          <property name="name"/>
          <property name="flat"/>
      </class>
 </hibernate-mapping>

 

Post的类定义以下映射文件如下:

 

package entity;


public class Post {

    private long oid;
    private String name;
    private int flat;


    public long getOid() {return oid;}
    public void setOid(long oid) {this.oid = oid;}
    public String getName() {return name;}
    public void setName(String name) {this.name = name;}
    public int getFlat() {return flat;}
    public void setFlat(int flat) {this.flat = flat;}
}

 

<?xml version="1.0" encoding="UTF-8"?>
 
<!DOCTYPE hibernate-mapping PUBLIC 
"-//Hibernate/Hibernate Mapping DTD 3.0//EN" 
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="entity">
    <class name="Post" table="POST">
           <id name="oid" column="oid" type="long">
               <generator class="native"/>
          </id>
          <property name="name"/>
          <property name="flat"/>
      </class>
 </hibernate-mapping>

 

在Spring配置文件中配置JOTM

 

<!-- JOTM本地实例 -->
<bean id="jotm" class="org.springframework.transaction.jta.JotmFactoryBean" />

<!-- JTA事务管理器 -->
<bean id="txManager" class="org.springframework.transaction.jta.JtaTransactionManager">
    <!-- 指定userTransaction属性 -->
    <property name="userTransaction" ref="jotm" />
</bean>


<!-- 业务类中的@Transaction注解进行驱动 -->
<tx:annotation-driven transaction-manager="txManager" />


<!-- XAPool配置,内部包含了一个XA数据源,对应test1数据库 -->
<bean id="topicDS" class="org.enhydra.jdbc.pool.StandardXAPoolDataSource"
destroy-method="shutdown">
    <property name="dataSource">
        <!-- 内部XA数据源 -->
        <bean class="org.enhydra.jdbc.standard.StandardXADataSource"
        destroy-method="shutdown">
            <property name="transactionManager" ref="jotm" />
            <property name="driverName" value="com.mysql.jdbc.Driver" />
            <property name="url" value="jdbc:MySQL://localhost:3306/test1?characterEncoding=gbk" />
        </bean>
    </property>
    <property name="user" value="yangyongbin" />
    <property name="password" value="bensun" />
</bean>
<!-- XAPool配置,内部包含了一个XA数据源,对应test2数据库 -->
<bean id="postDS" class="org.enhydra.jdbc.pool.StandardXAPoolDataSource"
destroy-method="shutdown">
    <property name="dataSource">
        <!-- 内部XA数据源 -->
        <bean class="org.enhydra.jdbc.standard.StandardXADataSource"
        destroy-method="shutdown">
            <property name="transactionManager" ref="jotm" />
            <property name="driverName" value="com.mysql.jdbc.Driver" />
            <property name="url" value="jdbc:MySQL://localhost:3306/test2?characterEncoding=gbk" />
        </bean>
    </property>
    <property name="user" value="yangyongbin" />
    <property name="password" value="bensun" />
</bean>

 

spring关于hibernate的设置

<bean id="topicSessionFactory"
  class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
  <property name="dataSource">
   <ref bean="topicDS" />
  </property>
  <property name="hibernateProperties">
   <props>
    <prop key="hibernate.dialect">
     org.hibernate.dialect.MySQLInnoDBDialect
    </prop>
    <prop key="hibernate.hbm2ddl.auto">create</prop>
    <prop key="hibernate.show_sql">true</prop>
   </props>
  </property>
 <property name="mappingResources">
   <list>
    <value>entity/topic.hbm.xml</value></list>
  </property>
 </bean>
 
 <bean id="postSessionFactory"
  class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
  <property name="dataSource">
   <ref bean="postDS" />
  </property>
  <property name="hibernateProperties">
   <props>
    <prop key="hibernate.dialect">
     org.hibernate.dialect.MySQLInnoDBDialect
    </prop>
    <prop key="hibernate.hbm2ddl.auto">create</prop>
    <prop key="hibernate.show_sql">true</prop>
   </props>
  </property>
 <property name="mappingResources">
   <list>
    <value>entity/post.hbm.xml</value></list>
  </property>
 </bean>

Topic和Post的业务类(它们不实现接口。BbsServiceImpl实现了接口,并调用Topic与Post业务类添加记录)
<bean id="topicService" class="service.TopicServiceImpl">
    <property name="sessionFactory">
        <ref bean="topicSessionFactory"/>
    </property>
</bean>
<bean id="postService" class="service.PostServiceImpl">
    <property name="sessionFactory">
        <ref bean="postSessionFactory"/>
    </property>
</bean>

<!-- 进行跨数据库JTA事务的业务类 -->
<bean id="bbsService" class="service.BbsServiceImpl">
<property name="topicService" ref="topicService" />
<property name="postService" ref="postService" />
</bean>

 

TopicServiceImpl 与 PostServiceImpl定义

 

package service;


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


public class TopicServiceImpl extends HibernateDaoSupport {
    public void save(Topic topic){
        this.getHibernateTemplate().saveOrUpdate(topic);
    }
}

 

package service;


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


public class PostServiceImpl extends HibernateDaoSupport{
    public void save(Post post){
        this.getHibernateTemplate().saveOrUpdate(post);
    }
}

 

BbsService 与 BbsServiceImpl 定义

 

package service;


public interface BbsService {
    public void add();
}

 

package service;


import org.springframework.transaction.annotation.Transactional;
import entity.Post;
import entity.Topic;


@Transactional //事务注解,以便Spring动态织入事务管理功能
public class BbsServiceImpl implements BbsService {
    private TopicServiceImpl topicService;
    private PostServiceImpl postService;

    public void setTopicService(TopicServiceImpl topicService) {
        this.topicService = topicService;
    }
    public void setPostService(PostServiceImpl postService) {
        this.postService = postService;
    }
    @Override
    public void add() {//该方法将被施加JTA事务的增强
  
        Topic topic=new Topic();
        topic.setName("第一Topic");
        topic.setFlat(1);
       
        Post post=new Post();
        post.setName("第一Post");
        post.setFlat(0);
       
        topicService.save(topic);
        postService.save(post);
       
        throw new RuntimeException("事务回滚!");
    }

}


测试类定义

package test;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import service.BbsService;

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations="classpath:/applicationContext_jotm.xml") 
public class UTest_JOTM {

    @Autowired 
    private BbsService bbsService; 
   
    @Test
    public void test(){
        bbsService.add();
    }
     
}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

spring3.0.3+hibernate3.5.4+JOTM2.2.1实现JTA事务管理 的相关文章

随机推荐

  • 轻松拿结果-第二部分 同力 -第五章 用制度保障业绩

    第五章 用制度保障业绩 制度的保障 体现的是管理者的监管能力 也是守护胜利果实的有力保障 只有铁的纪律 才能拿到铁的结果 商场如战场 在公司您们就是带兵打仗的将军 有一个销售员踢球时伤到了腿 在他休息的两个月里 业绩却没有落下一点 都是整个
  • html5 悬停边框,Html,css:在悬停时更改行的边框颜色(Html,css: Change a row's border colow on hover)...

    Html css 在悬停时更改行的边框颜色 Html css Change a row s border colow on hover 我正在使用DataTables 我试图在行悬停时将行的顶部和底部边框更改为红色 以下没有改变颜色 tab
  • 消息的顺序消费

    首先 需要保证顺序的消息要发送到同一个messagequeue中 其次 一个messagequeue只能被一个消费者消费 这点是由消息队列的分配机制来保证的 最后 一个消费者内部对一个mq的消费要保证是有序的 我们要做到生产者 messag
  • 强化学习笔记(5)-回合策略梯度算法

    以下为阅读 强化学习 原理与python实现 这本书第七章的学习笔记 在之前学习到的强度学习方法中 都是通过学习最优价值函数来获得最优策略 现在换一个角度来思考 我们可以通过用含参函数来近似最优策略 并在迭代中更新参数值 这就是策略梯度算法
  • C#、C++、Java、Python选择哪个好?

    一个好的程序员不能把自己绑定在一种语言上 不能把自己就定义为JAVA程序员 C 程序员 等等 语言没有高下之分 只有适用的场景 好的程序员 应该有很快学会一种新的语言 并解决实际问题的能力 在我二十年的程序生涯中 有过不止一次 因为项目 一
  • Oracle服务器性能全面调整攻略

    Oracle服务器性能全面调整攻略 Oracle服务器是高度可调的数据库系统 它提供了许多特性 正确地设置和调整可以有效提高系统性能 因此 对系统进行调整是数据库管理员的主要责任 由于应用设计人员很少或根本不会给数据库管理人员提供必要的信息
  • flink学习42:tableAPI的join、union、排序、插入操作

    连接 内连接 外连接 集合操作 union 获取交集 获取差集 in 操作 排序操作 插入操作
  • 交友盲盒完整版——详细源码分享

    现在目前比较火热的一款app交友盲盒是通过uniapp springboot技术来制作的 原理其实很简单 大家一看便知 大家自行下载到手机里面去使用即可 不支持ios手机 演示地址 https share weiyun com l3ovzt
  • 基于python+flask实现视频数据可视化

    项目概要 对视频的标题 播放量 弹幕量以及收藏量 视频分类等数据进行分析 通过flask项目中的python代码进行数据库连接进行前后端交互功能的实现 通过layui框架进行系统前端页面的功能实现 通过knn分类算法以及k均值聚类算法对爬取
  • lterator 迭代器 静态属性Symbol.iterator Symbol(Symbol.iterator)

    lterator迭代器 迭代模式 提供一种方法是可以顺序获得聚合对象中的各个元素 是一种最简单也最常见的设计模式 他可以让用户透过特定的接口巡防集合中的每一个元素而不用了解底层的实现 迭代器简介 依照迭代模式的思想而实现 分为内部迭代器和外
  • java I/O流的一些常用操作

    java i o 的一些操作 文件流 FileInputStream FileOutputStream FileReader FileWriter 这四个类是专门操作文件流的 用法高度相似 区别在于前面两个是操作字节流 后面两个是操作字符流
  • 立创EDA专业版(网页,全在线模式)开源导入立创EDA专业版(PC端,半离线模式)

    我个人从一开始就使用立创EDA专业版的半离线模式 是因为既可以离线画板 又可以在在线的时候使用系统库 但难免完美 就不如将立创EDA专业版 网页 全在线模式 导入立创EDA专业版 PC端 半离线模式 时就很麻烦 下面来说下怎么操作 在立创E
  • Ecshop如何解决Deprecated: preg_replace()报错 (第一章)

    今天安装Ecshop后 运行出现各种问题 其中 Deprecated preg replace 之类的报错最多 下面贴出解决方案 错误原因 preg replace 函数中用到的修饰符 e 在 PHP5 5 x 中已经被弃用了 如果你的PH
  • js正则表达式

    w3school 正则表达式 一 正则表达式的使用 首先 我们一般使用正则表达式用来进行验证邮箱手机号等 进行匹配 1 编写一个正则表达式 var rule 我是一个正则表达式 2 使用正则表达式来进行验证 var isrule rule
  • 解决使用echarts时警告There is a chart instance already initialize on the dom.的两种方法

    第一种 使用dispose 方法清除实例 封装的方法 在每次使用init 方法创建echarts实例前调用即可 判断dom是否存在 这里传入的name是实例 const domIsExistence name gt if name null
  • CSS 中的响应单元

    响应式设计不仅仅是一个流行词 它是网络开发的一个重要方面 确保您的网页在各种设备上无缝地显示和运行至关重要 这种实践的基石之一是在 CSS 中使用响应式单元 在本文中 我们将深入研究响应式单元的有趣世界 并探讨它们如何使 Web 开发人员能
  • jspdf

    使用html2canval将html转为canvas 再使用jspdf实现导出pdf 需设置要导出的每一页为1400 900 要导出pdf的父元素容器不能有隐藏和滚动条 隐藏部分html2canval无法截屏转为canvas functio
  • Java PECS(Producer Extends Consumer Super)原则

    在看 Alibaba 开发手册时遇到 PECS 原则 刚开始阅读时感觉比较绕 也搜索了一些博文参考 个人觉得 Stackoverflow 的这篇文章比较实用 What is PECS Producer Extends Consumer Su
  • 「快学Docker」探索Docker的优势和多样化用途

    快学Docker 探索Docker的优势和多样化用途 Docker的优势 Docker的多样化用途 总结 Docker的优势 环境一致性 传统软件开发和部署中 环境配置常常是一个棘手的问题 不同环境之间可能存在差异 导致问题难以定位和解决
  • spring3.0.3+hibernate3.5.4+JOTM2.2.1实现JTA事务管理

    本文参考资料 http java e800 com cn articles 2007 417 1176746498587392322 1 html 实验方法 本文设置两个entity Topic对应test1数据库 Post对应test2数