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方法中如果不抛出异常,那么二个数据库中的数据都能添加成功,而如果在在二个方法中有一个出现错误,事物便会回滚保证事物的一致性。
分享到:
相关推荐
这个主题涉及到的是Java企业版(Java EE)中的核心组件——Enterprise JavaBeans (EJB)的第三版(EJB3),以及它在JBoss Application Server 6.0.0 Milestone 4 (JBOSS6.0.0M4)版本中的应用和测试。EJB3是Java EE的...
**EJB(Enterprise JavaBeans)**是...通过这个入门例程,你将学习到如何创建和配置EJB组件,如何在Java EE环境中部署和测试它们,以及如何编写客户端代码来调用EJB服务。这将为你进一步深入Java EE开发打下坚实基础。
- **JTA(Java Transaction API)**和JMS:了解这两个API在EJB中的应用。 - **测试和调试EJB**:掌握如何使用JUnit和其他工具对EJB进行单元测试和集成测试。 在实际开发中,EJB常常与其他Java EE组件如Servlet、JSP...
假设有一个EJB A需要使用EJB B和EJB C来完成某些任务,在传统的编程方式中,A需要自己管理B和C的生命周期,这会使得A变得复杂且难以测试。使用依赖注入之后,容器会在运行时自动将B和C注入到A中,从而简化了A的设计...
5. 部署描述符(Deployment Descriptor):在EJB2.0中,ejb-jar.xml文件包含了关于EJB的元数据,如Bean的接口、实现类、方法、安全性配置等,是容器理解和管理EJB的重要依据。 6. J2EE(Java 2 Platform, ...
例如,在EJB(Enterprise JavaBeans)中,你可以声明一个bean方法为`@TransactionAttribute(TransactionAttributeType.REQUIRED)`,这样服务器会自动管理事务的生命周期。如果方法内部出现异常,服务器会自动回滚...
在EJB开发中,WebLogic提供了集成的开发、测试和部署环境,便于开发者进行EJB应用的管理和调试。 5. RMI(Remote Method Invocation):RMI是Java中的远程方法调用机制,使得对象能够在不同的Java虚拟机之间进行...
- **JTA(Java Transaction API)**:EJB 2.0支持事务管理,允许在多个操作之间保持一致性和原子性。 - **EJB查询语言(EJB QL)**:在CMP中,用于查询和更新数据库的特定SQL方言。 - **容器服务**:如生命周期...
EJB使用JNDI(Java Naming and Directory Interface)进行服务查找和绑定,这是一种在分布式环境中定位对象的机制。本压缩包包含了一个EJB中JNDI使用源码的例子,可以帮助开发者深入理解这两者之间的交互。 在Java ...
在软件体系统结构实验中,EJB可能被用来演示如何在分布式环境中组织和管理复杂的业务逻辑。这可能涉及到多层架构,如表现层(Web层)、业务逻辑层(EJB层)和数据访问层,以及如何使用EJB来实现各层之间的通信和数据...
在面试中,EJB相关的问题常常被用来测试候选人在企业级Java开发领域的专业素养。 94、EJB 2.0的内容和场合: EJB 2.0规范包括Bean提供者、应用程序装配者、EJB容器、EJB配置工具、EJB服务提供者以及系统管理员。...
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 3.1的编程模型和API。 EJB 3.1的重要特性包括: 1. **注解驱动的开发**:与EJB 2.x相比,EJB 3.1大量使用了Java注解,使得开发者无需编写大量的XML配置文件...
在多组件系统中,JTA允许协调不同资源(如数据库、消息队列等)的事务,确保原子性和一致性。在Spring框架中,可以通过配置使Spring的声明式事务管理支持JTA,实现跨多个数据源的事务管理。 集成这四个技术的步骤...
在实际开发中,这样的购书系统可能还需要集成其他Java EE组件,如JDBC(Java Database Connectivity)用于数据库连接,JTA(Java Transaction API)处理事务管理,以及JMS(Java Message Service)进行异步通信。...
在EJB3中,主要的组件包括: 1. **实体Bean (Entity Beans)**:代表持久化的数据对象,EJB3中实体Bean使用了JPA(Java Persistence API)进行持久化管理,使得ORM(对象关系映射)更为简便。 2. **会话Bean (Session...
3. **测试**: 在 JBoss 控制台中确认 EJB 是否已成功部署,并通过简单的客户端程序进行功能验证。 ##### 2.3 在独立的 Tomcat 中调用 EJB 1. **配置 JNDI**: 在 Tomcat 中设置 JNDI 属性,使其能够访问远程 JBoss ...
在阅读本书的过程中,读者将学到如何利用Java EE8和EJB来设计、开发、测试和部署高效、可扩展的企业级应用程序。无论是初学者还是有经验的开发者,都可以从中获得宝贵的指导和启发,提升自己的专业技能。 总而言之...