`
alex09
  • 浏览: 977006 次
  • 性别: 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  
保存实体循环一百万次有难道不报错?

相关推荐

    EJB与事务 -详细描述EJB和事务

    总的来说,EJB的事务管理是Java EE中实现可靠服务的关键部分,它允许开发者专注于业务逻辑,而不必过于关注事务的细节。通过EJB容器提供的事务服务,开发者可以更高效地构建可伸缩且可靠的分布式应用程序。

    ejb3.0 分布式事务

    EJB3.0中,事务管理分为容器管理的事务(CMT, Container-Managed Transactions)和 bean 管理的事务(BMT, Bean-Managed Transactions)。CMT是默认模式,由容器自动管理事务的开始、提交、回滚,开发者只需关注...

    EJB的事务属性

    总之,EJB的事务属性是Java EE平台为企业级应用提供的重要特性之一,它简化了事务管理,使开发人员能够专注于核心业务逻辑,而不必担心底层的事务控制细节。通过合理配置这些属性,可以显著提高应用程序的性能、可靠...

    EJB3-JBOSS7-分布式事务示例

    4. **容器管理的事务**:EJB3支持自动事务管理,可以通过`@TransactionAttribute`来定义事务的传播行为和隔离级别。 **JBoss AS7 (现为WildFly)** 是一个开源的应用服务器,它是EJB3规范的一个实现,提供了运行和...

    ejb3 带源码

    EJB(Enterprise JavaBeans)是Java企业级应用开发的核心组件之一,主要负责处理业务逻辑,为应用程序提供可重用、可扩展和可管理的服务。EJB3是EJB规范的一个重要版本,它在EJB2的基础上进行了重大改进,极大地简化...

    EJB3基础教程

    EJB3中的容器管理的事务(CMT)允许开发者无需关心事务的开始、提交或回滚,这些都由EJB容器自动处理。开发者只需在方法上添加`@TransactionAttribute`注解来指定事务的属性。 ### 6. 容器服务 EJB3提供了一系列的...

    EJB3(入门经典简版)

    企业级JavaBeans(EJB)是Java平台上用于构建可扩展、安全且事务管理的企业级应用程序的核心技术。EJB3是EJB规范的一个重大改革版本,引入了许多简化开发的新特性,使得Java开发者能够更高效地构建分布式企业应用。 ...

    EJB3 PPT教程

    EJB3的bean默认支持声明式事务管理,即通过注解如`@TransactionAttribute`来定义事务的边界和策略。 通过这个PPT教程,你将全面了解EJB3的各种组件和它们在实际开发中的应用。理解并掌握这些知识点,你就能更有效地...

    EJB实体Bean与事物管理

    3. **EJB事务属性** - **REQUIRED**: 默认属性,如果当前没有事务,容器会创建一个新的事务。 - **REQUIRES_NEW**: 创建一个新的事务,即使当前存在事务,新事务也会独立于当前事务运行。 - **MANDATORY**: 如果...

    EJB3应用实例

    通过这个"JBOSS7+EJB3"实例,我们可以深入了解EJB3如何在实际环境中运行,以及如何在JBOSS7这样的应用服务器上部署和管理EJB服务。这不仅有助于提升开发者对EJB3的理解,也有助于在实际项目中更高效地利用EJB3来构建...

    ejb3进阶案例

    ejb3的实体管理器提供了事务管理和懒加载等功能,大大提高了开发效率。 **3. MessageDriven Bean** MessageDriven Bean(消息驱动Bean)是ejb3中的一个特殊类型,主要用于处理JMS(Java Message Service)消息。...

    EJB 3实战 带书签

    EJB容器提供了一组服务,如事务管理、安全性、远程访问和生命周期管理等,开发者可以很轻松地在不编写额外代码的情况下使用这些服务。此外,EJB 3还引入了无状态会话Bean和有状态会话Bean这两种类型的Bean,分别用于...

    ejb3课堂笔记,适合初学者

    - **容器** (Container): 负责管理EJB实例的生命周期,提供服务如事务管理、安全性、持久性等。 - **远程接口** (Remote Interface): 定义了客户端与EJB交互的方法。 - **本地接口** (Local Interface): 只能在同...

    EJB3开发Entity

    EJB3提供自动的事务管理,开发者可以通过注解来控制事务的边界,例如`@TransactionAttribute(TransactionAttributeType.REQUIRED)`。 6. **查询语言JPA QL** JPA提供了自己的查询语言——JPA Query Language...

    EJB3入门例子

    JBoss AS5提供了丰富的管理和监控工具,方便开发者部署和调试EJB3应用。 **myEclipse**是一款集成开发环境,特别适合Java EE应用的开发,包括EJB3项目。它集成了众多开发工具,如代码编辑器、调试器、部署工具等,...

    EJB3 入门经典 源码

    8. **事务管理(Transaction Management)**:EJB容器提供了自动事务管理,开发者无需关心事务的开始、提交或回滚,只需专注于业务逻辑。 9. **安全控制(Security)**:EJB3允许开发者使用角色和权限来控制对bean...

    EJB3 实例练习(一)

    EJB3支持容器管理的事务,这意味着开发者无需手动管理事务的开始、提交和回滚。容器会根据bean方法的标注自动处理事务。例如,`@TransactionAttribute(TransactionAttributeType.REQUIRED)`表明方法将在现有事务中...

    ejb3-persistence

    这些类和接口提供了CRUD(创建、读取、更新、删除)操作,事务管理,以及查询语言JPA(Java Persistence API)的实现,如Criteria API和JPQL(Java Persistence Query Language)。 "使用说明-jar包.txt"很可能是对...

    EJB3实战的源代码

    6. **容器管理事务(CMT)**:EJB3的事务管理能力让开发者可以专注于业务逻辑,而不用关心事务的开始、提交和回滚。 7. **安全性**:EJB3提供了内置的角色和权限管理,可以使用`@RolesAllowed`等注解来控制对Bean...

    EJB3入门

    EJB3提供了容器管理的事务(Container Managed Transactions),开发者只需在方法上添加`@TransactionAttribute`注解,如`@TransactionAttribute(TransactionAttributeType.REQUIRED)`,即可让容器自动处理事务的...

Global site tag (gtag.js) - Google Analytics