`
alex09
  • 浏览: 969736 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

EJB3事务管理服务

    博客分类:
  • EJB3
阅读更多
最有用的容器服务可能就是事务管理服务,当应用出现失败或异常时,它保证了数据库的完整性。最常见的事务是定义在session bean 的方法上,方法中所有的数据库操作只有在方法正常退出时才会提交,如果方法抛出未捕获的异
常,事务管理将回滚所有的变更。
@TransactionAttribute 注释用作定义一个需要事务的方法。它可以有以下参数:
1.REQUIRED:方法在一个事务中执行,如果调用的方法已经在一个事务中,则使用该事务,否则将创建一
个新的事务。
2.MANDATORY:如果运行于事务中的客户调用了该方法,方法在客户的事务中执行。如果客户没有关联到
事务中,容器就会抛出TransactionRequiredException。如果企业bean 方法必须用客户事务则采用Mandatory 属性。
3.REQUIRESNEW:方法将在一个新的事务中执行,如果调用的方法已经在一个事务中,则暂停旧的事务。在
调用结束后恢复旧的事务。
4.SUPPORTS:如果方法在一个事务中被调用,则使用该事务,否则不使用事务。
5.NOT_SUPPORTED:如果方法在一个事务中被调用,容器会在调用之前中止该事务。在调用结束后,容器
会恢复客户事务。如果客户没有关联到一个事务中,容器不会在运行入该方法前启动一个新的事务。用
NotSupported 属性标识不需要事务的方法。因为事务会带来更高的性能支出,所以这个属性可以提高性能。
6.Never:如果在一个事务中调用该方法,容器会抛出RemoteException。如果客户没有关联到一个事务中,
容器不会在运行入该方法前启动一个新的事务。
如果没有指定参数,@TransactionAttribute 注释使用REQUIRED 作为默认参数。
下面的代码展示了事务管理的开发:
TransactionDAOBean.java
package com.zhaosoft.session;
 
import java.util.List;
 
import javax.ejb.Remote;
import javax.ejb.Stateless;
import javax.ejb.TransactionAttribute;
import javax.ejb.TransactionAttributeType;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;
 
import com.zhaosoft.bean.Product;
import com.zhaosoft.exception.TransException;
 
@Stateless
@Remote( { TransactionDAO.class })
public class TransactionDAOBean implements TransactionDAO {
 
       @PersistenceContext
       protected EntityManager em;
 
       @TransactionAttribute(TransactionAttributeType.REQUIRED)
       public void insertProduct(String name, Float price, boolean error) {
              try {
                     for (int i = 0; i < 3; i++) {
                            Product product = new Product(name + i, price * (i + 1));
                            em.persist(product);
                     }
                     if (error) {
 
                            new Float("kkk"); // 制造一个例外
                     }
 
              } catch (Exception e) {
                     throw new RuntimeException("应用抛出运行时例外,为了使事务回滚,外部不要用try/catch包围");
              }
       }
 
       @TransactionAttribute(TransactionAttributeType.REQUIRED)
       public void ModifyProductName(String newname, boolean error)
                     throws Exception {
              Query query = em.createQuery("select p from Product p");
              List result = query.getResultList();
              if (result != null) {
                     for (int i = 0; i < result.size(); i++) {
                            Product product = (Product) result.get(i);
                            product.setName(newname + i);
                            em.merge(product);
                     }
 
                     if (error && result.size() > 0)
                            throw new TransException("抛出应用例外");
              }
       }
}

上面定义了两个需要事务的方法,容器在运行这两个方法时将会创建一个事务,方法里的所有数据库操作都在此
事务中运行,当这两个方法正常退出时,事务将会提交,所有更改都会同步到数据库中。如果方法抛出
RuntimeException 例外或ApplicationException 例外,事务将会回滚。方法ModifyProductName 中使用的
TransException 类是一个自定义ApplicationException 例外。代码如下:
TransException.java
package com.zhaosoft.exception;
publicclass TransException extends Exception {
    public TransException(String message) {
       super(message);
    }
}
@ApplicationException 注释定义了在例外抛出时将回滚事务。
//下面是TransactionDAOBean 的接口
//TransactionDAO.java
package com.zhaosoft.session;
publicinterface TransactionDAO {
    publicvoid insertProduct(String name, Float price, boolean error);
    publicvoid ModifyProductName(String newname, boolean error) throws Exception ;
}
//下面是TransactionDAOBean 使用的实体Bean
//Product.java
package com.zhaosoft.bean;
import java.io.Serializable;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Table;
@Entity
@Table(name = "Products")
public class Product implements Serializable {
       private int hashCode = Integer.MIN_VALUE;
       private Integer productid;
       private String name;
       private Float price;
 
       public Product() {
       }
 
       public Product(String name, Float price) {
              this.name = name;
              this.price = price;
       }
 
       @Id
       @GeneratedValue
       public Integer getProductid() {
              return productid;
       }
 
       public void setProductid(Integer productid) {
              this.productid = productid;
       }
 
       @Column(name = "ProductName", nullable = false, length = 50)
       public String getName() {
              return name;
       }
 
       public void setName(String name) {
              this.name = name;
       }
 
       @Column(nullable = false)
       public Float getPrice() {
              return price;
       }
 
       public void setPrice(Float price) {
              this.price = price;
       }
 
       public boolean equals(Object obj) {
              if (null == obj)
                     return false;
              if (!(obj instanceof Product))
                     return false;
              else {
                     Product mObj = (Product) obj;
                     if (null == this.getProductid() || null == mObj.getProductid())
                            return false;
                     else
                            return (this.getProductid().equals(mObj.getProductid()));
              }
       }
 
       public int hashCode() {
              if (Integer.MIN_VALUE == this.hashCode) {
                     if (null == this.getProductid())
                            return super.hashCode();
                     else {
                            String hashStr = this.getClass().getName() + ":"
                                          + this.getProductid().hashCode();
                            this.hashCode = hashStr.hashCode();
                     }
              }
              return this.hashCode;
       }
}
//下面是Session Bean 的JSP 客户端代码:
<%@ page contentType="text/html; charset=GBK"%>
<%@ page import="com.zhaosoft.session.TransactionDAO,
javax.naming.*,
java.util.*"%>
<%
Properties props = new Properties();
props.setProperty("java.naming.factory.initial","org.jnp.interfaces.NamingContextFactory");
props.setProperty("java.naming.provider.url", "localhost:1099");
props.setProperty("java.naming.factory.url.pkgs", "org.jboss.naming");
try {
InitialContext ctx = new InitialContext(props);
TransactionDAO transactiondao = (TransactionDAO)
ctx.lookup("TransactionDAOBean/remote");
 
//transactiondao.insertProduct("电脑", new Float("1200"),false);
 
transactiondao.ModifyProductName("数码相机", true);
out.println("执行完成");
} catch (Exception e) {
out.println(e.getMessage());
}
%>
 
//Persistence.xml文件
<?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns="http://java.sun.com/xml/ns/persistence"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/persistence
    http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd" version="1.0">
   
    <persistence-unit name="EJB17PU" transaction-type="JTA">
       <jta-data-source>java:/zhaosoft</jta-data-source>
       <properties>
       <property name="hibernate.hbm2ddl.auto" value="create-drop"/>
       </properties>
    </persistence-unit>
 
</persistence>
分享到:
评论
1 楼 zhongaili520 2010-05-18  
保存实体循环一百万次有难道不报错?

相关推荐

    EJB3开发指南《EJB.3.Developer.Guide》

    EJB3开发指南英文版《EJB.3.Developer.Guide》 出版商:PacketPublishing 出版日期:2008年5月 页数:276 简介: 第一章:EJB3体系结构简介 第二章:Session Beans 第三章:实体Entities 第四章:对象关系映射ORM 第...

    经典JAVA.EE企业应用实战.基于WEBLOGIC_JBOSS的JSF_EJB3_JPA整合开发.pdf

    4.4 EJB的事务管理 201 4.4.1 容器管理事务(CMT) 201 4.4.2 Bean管理事务(BMT) 201 4.5 事务超时设置 201 4.6 本章小结 203 第5章 JNDI和远程方法调用 204 5.1 JNDI的概念 205 5.1.1 命名服务 205 5.1.2 目录服务 ...

    EJB 3.0从入门到精通

    内容依次包含了Java EE概述、EJB基础、搭建EJB环境、会话bean、持久化实体、持久化实体管理器、对象关系映射、JPQL查询、消息驱动bean、事务、提高EJB 3.0性能、从Web层访问EJB 3和EJB安全、EJB和Web服务及EJB表现层...

    ejb3.0培训教程与源码(绝对精品)

    3)资源管理和组件的声明周期的管理; 4)远程的调用:屏蔽了很多细节 5)并发请求 ( EJB都是单线程的 ); 不要在EJB的代码中写多线程的代码; 6)集群 7)负载均衡 5, EJB的类型 1) 会话Bean: 实现业务逻辑 有状态...

    Java中各种事务管理技术的总结

    内容包括事务及其控制的基本概念,Oracle中的事务处理,以及JDBC,EJB,JTA事务管理内容的总结,最后还介绍了事务管理的技巧,是了解和学习JAVA事务处理不可多得的第一手资料!

    oracle-mysql 两阶段提交例子(ejb3)

    ejb3事务分容器管理事务(CMT)和Bean管理事务(BMT),这里讲述了CMT情况下,两阶段提交例子(tow-phase commit),展示ejb容器为我们做的事情,其实就是ejb容器提供商,已经帮开发者解决了的问题。数据库分别是oracle...

    EJB3.0实录教程+配套源码

    ejb3.0培训教程与源码 #######含真正配套源码 .................... ...3)资源管理和组件的声明周期的管理; 4)远程的调用:屏蔽了很多细节 5)并发请求 ( EJB都是单线程的 ); 不要在EJB的代码中写多线程的代码;

    Weblogic EJB 学习笔记

    Weblogic EJB 学习笔记 ejb 基础知识 EJB 组成 EJB 配置描述器 建立ejb 档案文件 容器管理的事务 ejb 引用

    EJB中的JTA与JTS例子代码

    JTS则规定了支持JTA的事务管理器的实现规范,在高层API之下实现了OMG Object Transaction Service(OTS) 1.1规范的Java映射。JTS使用Internet Inter-ORB Protocol(IIOP)来传播事务。本例子将介绍JTA与JTS在具体应用中...

    名片管理(EJB3.0)

    使用EJB3.0开发的,支持分布式管理和事务控制,想学EJB3.0的朋友可以下载下来看看,很有帮助

    Wicket6.7_Spring3.2_Hibernate4.2_EJB全注解实例

    Wicket6.7 Spring3.2 Hibernate4.2 EJB全注解实例.采用JTA事务管理,配置ehcache为二级缓存,在glassfish3.2.2和postgresql9测试通过。参考网上的资料整理。

    11.事务——为服务器端增加JTA事务管理功能

    Java Web即Java EE,它是面向企业级的网络系统,其中的“企业级”和“网络”...在Java EE最新的规范中提供了进行企业级开发的框架组件EJB,并同时提供了多种分布式服务开发技术方案,以及多种企业应用的业务解决方案。

    EJBContainer:EJB 容器的个人实现

    每个事务都与打开它的线程的标识符相关联,以保证事务管理器的线程安全操作。 使用@PersistenceContext 注释的实体管理器注入。 然后,管理器使用事务管理器来检索当前事务并在那里执行其操作。 管理 EJB 初始化...

    Java EJB JTA JTS用法示例源代码.rar

    JTS则规定了支持JTA的事务管理器的实现规范,在高层API之下实现了OMG Object Transaction Service(OTS) 1.1规范的Java映射。JTS使用Internet Inter-ORB Protocol(IIOP)来传播事务。  本源码包中的例子将介绍JTA与...

    ejb的详细介绍

    3. 透明的失败恢复 客户端不会发现 4. 后台继承(JCA) JCA软件能做到java程序调用非java程序 5. 分布式事务 6. 动态重部署 7. 无损关机(服务器停掉的时候保证没有客户) 8. 登陆和授权 9. 系统管理(当软件有问题时能够...

    Java编程语言中EJB技术的详细说明

    Enterprise JavaBean (EJB) 1.1 规范定义了开发和部署基于事务性、分布式对象应用程序的服务器端软件组件的体系结构。企业组织可以构建它们自己的组件,或从第三方供应商购买组件。这些服务器端组件称作 Enterprise ...

    基于TCC机制的分布式事务管理器源代码

    ByteTCC是一个基于TCC(Try/Confirm/Cancel)机制的分布式事务管理器。兼容JTA,可以很好的与EJB、Spring等容器(本文档下文说明中将以Spring容器为例)进行集成。

    EJB详解 sessionbean entitybean MDB

    主要提供声明周期管理、代码产生、持续性管理、安全、事务管理、锁和并发行管理等服务

    java高手真经 高级编程卷 卷3(4卷)

    事务——为服务端增加JTA事务管理功能 emis04(EJB+MySQL+JTA+JAAS).zip //12.安全——为服务端增加JAAS安全验证功能 emis04(Struts2+Spring+EJB+JAAS).zip //12.安全——为客户端增加JAAS安全验证功能

    在SPRING中实现事务暂停

    摘要Spring框架是一个流行的基于轻量级控制反转容器的Java/J2EE应用框架,尤其在数据访问和事务管理方面的能力是众所周知的。Spring的声明性事务分离可以应用到任何POJO目标对象,并且包含所有EJB基于容器管理事务中...

Global site tag (gtag.js) - Google Analytics