`

在EJB中测试JTA

    博客分类:
  • EJB
阅读更多
1、首先在jboss 中mysql-ds.xml的配置文件中配置二个数据源
<local-tx-datasource>
    <jndi-name>MySqlDS</jndi-name>
    <connection-url>jdbc:mysql://localhost:3306/ejb</connection-url>
    <driver-class>com.mysql.jdbc.Driver</driver-class>
    <user-name>root</user-name>
    <password>admin</password>
    <exception-sorter-class-name>org.jboss.resource.adapter.jdbc.vendor.MySQLExceptionSorter</exception-sorter-class-name>
        <metadata>
       <type-mapping>mySQL</type-mapping>
    </metadata>
  </local-tx-datasource>
  <local-tx-datasource>
    <jndi-name>MySqlDS2</jndi-name>
    <connection-url>jdbc:mysql://localhost:3306/ejb2</connection-url>
    <driver-class>com.mysql.jdbc.Driver</driver-class>
    <user-name>root</user-name>
    <password>admin</password>
    <exception-sorter-class-name>org.jboss.resource.adapter.jdbc.vendor.MySQLExceptionSorter</exception-sorter-class-name>
          <metadata>
       <type-mapping>mySQL</type-mapping>
    </metadata>
  </local-tx-datasource>

2、在建立好的ejb项目中的persistence.xml配置文件中做好相应的配置
<persistence-unit name="test" transaction-type="JTA">
  		<jta-data-source>java:/MySqlDS</jta-data-source>
  		<class>com.bjsxt.jpa.Person</class>
  		<exclude-unlisted-classes>true</exclude-unlisted-classes>
  		<properties>
  			<property name="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect"/>
  			<property name="hibernate.show_sql" value="true"/>
  			<property name="hibernate.hbm2ddl.auto" value="update"/>
  		</properties>
	</persistence-unit>
	
	<persistence-unit name="test2" transaction-type="JTA">
  		<jta-data-source>java:/MySqlDS2</jta-data-source>
  		<class>com.bjsxt.jpa.User</class>
  		<exclude-unlisted-classes>true</exclude-unlisted-classes>
  		<properties>
  			<property name="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect"/>
  			<property name="hibernate.show_sql" value="true"/>
  			<property name="hibernate.hbm2ddl.auto" value="update"/>
  		</properties>
	</persistence-unit>


3、具体编码
//为了测试不同的事物,下面编写了2个实体类
import java.io.Serializable;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;

@Entity
public class Person implements Serializable{
	@Id
	@GeneratedValue
	private int id;

	private String name;

	public int getId() {
		return id;
	}

	public String getName() {
		return name;
	}

	public void setId(int id) {
		this.id = id;
	}
	
	public void setName(String name) {
		this.name = name;
	}
}
import java.io.Serializable;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;

@Entity
public class User implements Serializable{
	@Id
	@GeneratedValue
	private int id;
	private String name;
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
}

//编写接口
public interface PersonService {	
	public void add(Person p, User u);
}

//编写实现
import javax.ejb.Local;
import javax.ejb.Remote;
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;

@Stateless
@Remote
@Local
public class PersonServiceImpl implements PersonService {
        //注意:下面的add方法中存储的二个对象是放在两个不同的数据库中的
	@PersistenceContext(unitName="test")
	private EntityManager entityManager;
	@PersistenceContext(unitName="test2")
	private EntityManager entityManager2;
	public void add(Person p, User u) {
		entityManager.persist(p);
		entityManager2.persist(u);
         //在此抛出一个异常,看事物能否回滚、
		throw new RuntimeException("Error");	}
}

//客户端调用
import javax.naming.InitialContext;

import com.bjsxt.jpa.Person;
import com.bjsxt.jpa.PersonService;
import com.bjsxt.jpa.User;

public class Client {
	public static void main(String[] args) throws Exception{
		InitialContext ctx = new InitialContext();
		PersonService ps = (PersonService)ctx.lookup("PersonServiceImpl/remote");
		
		Person p = new Person();
		p.setName("张三");
		
		User u = new User();
		u.setName("李四");
		
		ps.add(p, u);
   }
}

实验结果:在add方法中如果不抛出异常,那么二个数据库中的数据都能添加成功,而如果在在二个方法中有一个出现错误,事物便会回滚保证事物的一致性。
分享到:
评论
1 楼 潜心修炼 2011-01-28  
如果想要测试JTA,需要使用tx-datasource数据源
你的测试中只是使用了本地的事务管理器

相关推荐

    JBOSS6.0.0M4发布EJB3测试

    这个主题涉及到的是Java企业版(Java EE)中的核心组件——Enterprise JavaBeans (EJB)的第三版(EJB3),以及它在JBoss Application Server 6.0.0 Milestone 4 (JBOSS6.0.0M4)版本中的应用和测试。EJB3是Java EE的...

    一个EJB项目入门例程

    **EJB(Enterprise JavaBeans)**是...通过这个入门例程,你将学习到如何创建和配置EJB组件,如何在Java EE环境中部署和测试它们,以及如何编写客户端代码来调用EJB服务。这将为你进一步深入Java EE开发打下坚实基础。

    精通EJB EJB教程

    - **JTA(Java Transaction API)**和JMS:了解这两个API在EJB中的应用。 - **测试和调试EJB**:掌握如何使用JUnit和其他工具对EJB进行单元测试和集成测试。 在实际开发中,EJB常常与其他Java EE组件如Servlet、JSP...

    ejb 学习笔记6

    假设有一个EJB A需要使用EJB B和EJB C来完成某些任务,在传统的编程方式中,A需要自己管理B和C的生命周期,这会使得A变得复杂且难以测试。使用依赖注入之后,容器会在运行时自动将B和C注入到A中,从而简化了A的设计...

    EJB2.0

    5. 部署描述符(Deployment Descriptor):在EJB2.0中,ejb-jar.xml文件包含了关于EJB的元数据,如Bean的接口、实现类、方法、安全性配置等,是容器理解和管理EJB的重要依据。 6. J2EE(Java 2 Platform, ...

    JTA-demo说明文档.doc

    例如,在EJB(Enterprise JavaBeans)中,你可以声明一个bean方法为`@TransactionAttribute(TransactionAttributeType.REQUIRED)`,这样服务器会自动管理事务的生命周期。如果方法内部出现异常,服务器会自动回滚...

    ejb例题

    在EJB开发中,WebLogic提供了集成的开发、测试和部署环境,便于开发者进行EJB应用的管理和调试。 5. RMI(Remote Method Invocation):RMI是Java中的远程方法调用机制,使得对象能够在不同的Java虚拟机之间进行...

    EJB2.rar_ejb 2.0 demo_ejb2_ejb2 demo

    - **JTA(Java Transaction API)**:EJB 2.0支持事务管理,允许在多个操作之间保持一致性和原子性。 - **EJB查询语言(EJB QL)**:在CMP中,用于查询和更新数据库的特定SQL方言。 - **容器服务**:如生命周期...

    java源码:EJB中JNDI的使用源码例子.zip

    EJB使用JNDI(Java Naming and Directory Interface)进行服务查找和绑定,这是一种在分布式环境中定位对象的机制。本压缩包包含了一个EJB中JNDI使用源码的例子,可以帮助开发者深入理解这两者之间的交互。 在Java ...

    EJB.rar_ejb

    在软件体系统结构实验中,EJB可能被用来演示如何在分布式环境中组织和管理复杂的业务逻辑。这可能涉及到多层架构,如表现层(Web层)、业务逻辑层(EJB层)和数据访问层,以及如何使用EJB来实现各层之间的通信和数据...

    Java EJB 经典面试题 面试时被问过几个

    在面试中,EJB相关的问题常常被用来测试候选人在企业级Java开发领域的专业素养。 94、EJB 2.0的内容和场合: EJB 2.0规范包括Bean提供者、应用程序装配者、EJB容器、EJB配置工具、EJB服务提供者以及系统管理员。...

    agent-ejb-2.1.6.jar.zip

    EJB 2.1是EJB的一个早期版本,尽管在功能上不如后来的EJB 3.x简洁和灵活,但在许多遗留系统中仍然广泛使用。 "agent-ejb-2.1.6.jar"这个文件名暗示了这是一个EJB模块,其版本为2.1.6,且被封装在.jar(Java Archive...

    ejb-3_1-pr-api.zip_EJB a_ejb_ejb api

    在这个ejb-3_1-pr-api.zip文件中,我们主要关注的是EJB 3.1的编程模型和API。 EJB 3.1的重要特性包括: 1. **注解驱动的开发**:与EJB 2.x相比,EJB 3.1大量使用了Java注解,使得开发者无需编写大量的XML配置文件...

    Jboss4.2.2+Spring2.5.6+hibernate+JTA事务的实现

    在多组件系统中,JTA允许协调不同资源(如数据库、消息队列等)的事务,确保原子性和一致性。在Spring框架中,可以通过配置使Spring的声明式事务管理支持JTA,实现跨多个数据源的事务管理。 集成这四个技术的步骤...

    基于Struts+EJB购书系统

    在实际开发中,这样的购书系统可能还需要集成其他Java EE组件,如JDBC(Java Database Connectivity)用于数据库连接,JTA(Java Transaction API)处理事务管理,以及JMS(Java Message Service)进行异步通信。...

    EJB3+JBOSS5+JPA整合

    在EJB3中,主要的组件包括: 1. **实体Bean (Entity Beans)**:代表持久化的数据对象,EJB3中实体Bean使用了JPA(Java Persistence API)进行持久化管理,使得ORM(对象关系映射)更为简便。 2. **会话Bean (Session...

    EJB3.0实例教程服务器为JBOSS

    3. **测试**: 在 JBoss 控制台中确认 EJB 是否已成功部署,并通过简单的客户端程序进行功能验证。 ##### 2.3 在独立的 Tomcat 中调用 EJB 1. **配置 JNDI**: 在 Tomcat 中设置 JNDI 属性,使其能够访问远程 JBoss ...

    Beginning EJB in Java EE8-2018

    在阅读本书的过程中,读者将学到如何利用Java EE8和EJB来设计、开发、测试和部署高效、可扩展的企业级应用程序。无论是初学者还是有经验的开发者,都可以从中获得宝贵的指导和启发,提升自己的专业技能。 总而言之...

Global site tag (gtag.js) - Google Analytics