最有用的容器服务可能就是事务管理服务,当应用出现失败或异常时,它保证了数据库的完整性。最常见的事务是定义在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>
分享到:
相关推荐
总的来说,EJB的事务管理是Java EE中实现可靠服务的关键部分,它允许开发者专注于业务逻辑,而不必过于关注事务的细节。通过EJB容器提供的事务服务,开发者可以更高效地构建可伸缩且可靠的分布式应用程序。
EJB3.0中,事务管理分为容器管理的事务(CMT, Container-Managed Transactions)和 bean 管理的事务(BMT, Bean-Managed Transactions)。CMT是默认模式,由容器自动管理事务的开始、提交、回滚,开发者只需关注...
总之,EJB的事务属性是Java EE平台为企业级应用提供的重要特性之一,它简化了事务管理,使开发人员能够专注于核心业务逻辑,而不必担心底层的事务控制细节。通过合理配置这些属性,可以显著提高应用程序的性能、可靠...
4. **容器管理的事务**:EJB3支持自动事务管理,可以通过`@TransactionAttribute`来定义事务的传播行为和隔离级别。 **JBoss AS7 (现为WildFly)** 是一个开源的应用服务器,它是EJB3规范的一个实现,提供了运行和...
EJB(Enterprise JavaBeans)是Java企业级应用开发的核心组件之一,主要负责处理业务逻辑,为应用程序提供可重用、可扩展和可管理的服务。EJB3是EJB规范的一个重要版本,它在EJB2的基础上进行了重大改进,极大地简化...
EJB3中的容器管理的事务(CMT)允许开发者无需关心事务的开始、提交或回滚,这些都由EJB容器自动处理。开发者只需在方法上添加`@TransactionAttribute`注解来指定事务的属性。 ### 6. 容器服务 EJB3提供了一系列的...
企业级JavaBeans(EJB)是Java平台上用于构建可扩展、安全且事务管理的企业级应用程序的核心技术。EJB3是EJB规范的一个重大改革版本,引入了许多简化开发的新特性,使得Java开发者能够更高效地构建分布式企业应用。 ...
EJB3的bean默认支持声明式事务管理,即通过注解如`@TransactionAttribute`来定义事务的边界和策略。 通过这个PPT教程,你将全面了解EJB3的各种组件和它们在实际开发中的应用。理解并掌握这些知识点,你就能更有效地...
3. **EJB事务属性** - **REQUIRED**: 默认属性,如果当前没有事务,容器会创建一个新的事务。 - **REQUIRES_NEW**: 创建一个新的事务,即使当前存在事务,新事务也会独立于当前事务运行。 - **MANDATORY**: 如果...
通过这个"JBOSS7+EJB3"实例,我们可以深入了解EJB3如何在实际环境中运行,以及如何在JBOSS7这样的应用服务器上部署和管理EJB服务。这不仅有助于提升开发者对EJB3的理解,也有助于在实际项目中更高效地利用EJB3来构建...
ejb3的实体管理器提供了事务管理和懒加载等功能,大大提高了开发效率。 **3. MessageDriven Bean** MessageDriven Bean(消息驱动Bean)是ejb3中的一个特殊类型,主要用于处理JMS(Java Message Service)消息。...
EJB容器提供了一组服务,如事务管理、安全性、远程访问和生命周期管理等,开发者可以很轻松地在不编写额外代码的情况下使用这些服务。此外,EJB 3还引入了无状态会话Bean和有状态会话Bean这两种类型的Bean,分别用于...
- **容器** (Container): 负责管理EJB实例的生命周期,提供服务如事务管理、安全性、持久性等。 - **远程接口** (Remote Interface): 定义了客户端与EJB交互的方法。 - **本地接口** (Local Interface): 只能在同...
EJB3提供自动的事务管理,开发者可以通过注解来控制事务的边界,例如`@TransactionAttribute(TransactionAttributeType.REQUIRED)`。 6. **查询语言JPA QL** JPA提供了自己的查询语言——JPA Query Language...
JBoss AS5提供了丰富的管理和监控工具,方便开发者部署和调试EJB3应用。 **myEclipse**是一款集成开发环境,特别适合Java EE应用的开发,包括EJB3项目。它集成了众多开发工具,如代码编辑器、调试器、部署工具等,...
8. **事务管理(Transaction Management)**:EJB容器提供了自动事务管理,开发者无需关心事务的开始、提交或回滚,只需专注于业务逻辑。 9. **安全控制(Security)**:EJB3允许开发者使用角色和权限来控制对bean...
EJB3支持容器管理的事务,这意味着开发者无需手动管理事务的开始、提交和回滚。容器会根据bean方法的标注自动处理事务。例如,`@TransactionAttribute(TransactionAttributeType.REQUIRED)`表明方法将在现有事务中...
这些类和接口提供了CRUD(创建、读取、更新、删除)操作,事务管理,以及查询语言JPA(Java Persistence API)的实现,如Criteria API和JPQL(Java Persistence Query Language)。 "使用说明-jar包.txt"很可能是对...
6. **容器管理事务(CMT)**:EJB3的事务管理能力让开发者可以专注于业务逻辑,而不用关心事务的开始、提交和回滚。 7. **安全性**:EJB3提供了内置的角色和权限管理,可以使用`@RolesAllowed`等注解来控制对Bean...
EJB3提供了容器管理的事务(Container Managed Transactions),开发者只需在方法上添加`@TransactionAttribute`注解,如`@TransactionAttribute(TransactionAttributeType.REQUIRED)`,即可让容器自动处理事务的...