`
aladdin_leon
  • 浏览: 118836 次
  • 性别: Icon_minigender_1
  • 来自: 哈尔滨
社区版块
存档分类
最新评论

谈谈实体Bean

阅读更多

     想起了我的可爱的J2EE老师,决定把前一些日子学的东东总结一下,想到那里就总结那里吧...
     在EJB的技术体系中,实体Bean充当维护数据持久性的角色,它可能是最官方的O/R Mapping问题解决方案了吧。开发者可以利用实体Bean对关系数据库中的数据进行管理,EJB容器会为实体Bean提供可靠的服务支持,使实体Bean拥有可靠的性能。
     1. 那么什么是EJB容器呢?
     EJB容器为开发者提供了维护EJB对象的环境。在面向客户端的方面,EJB容器为EJB对象提供了客户端视图和接口,通过特定的传输协议可以实现EJB容器和客户端之间调用EJB对象的过程,这样使得底层的RMI等具体的协议对用户是透明的;在面向设备和资源方面,EJB容器对数据库、邮件服务器、事务服务、消息服务器等各种资源进行管理,使开发者不必或很少需要与这些资源直接发生关系。EJB在提供这些服务时,保证了EJB对象的稳定性,而且通过容器的一些机制对EJB对象的服务处理进行了优化。在EJB容器中包含了3种EJB组件:实体Bean,
会话Bean和消息驱动Bean。实体Bean的主要作用就像开始时说的一样是维护数据的持久性;会话Bean可以提供实现业务逻辑的方法;消息驱动Bean是基于JAVA消息技术的EJB对象,可以与JMS程序相配合,实现对消息列队的操作。
   
     2.下面我们来看看实体Bean的生命周期
      实体Bean是用来管理数据持久性的EJB组件,主要功能是管理对象与关系数据库之间发生的操作。每个实体Bean对应数据库表中的一行数据,建立或删除一个实体Bean相应的会导致数据库的一行记录被建立或删除。实体Bean的业务功能有开发者实现(BMP),或者由EJB服务器根据实体Bean的配置文件生成(CMP)。实体Bean的生命周期是由EJB服务容器负责管理和维护的,同时每个实体Bean都需要实现javax.ejb.EntityBean接口,这个接口中的方法与实体Bean对象的状态有关,具体的接口是这样的:
            public void ejbActivate() throws EJBException, RemoteException;
            public void ejbLoad() throws EJBException, RemoteException;
            public void ejbPassivate() throws EJBException, RemoteException;
            public void ejbRemote() throws RemoveException,EJBException, RemoteException;
            public void ejbStore() throws EJBException, RemoteException;
            public void setEntityContext(EntityContext ctx) throws EJBException, RemoteException;
            public void unsetEntityContext() throws EJBException, RemoteException;
      实体Bean在EJB容器中有3种状态:不存在、正在池中缓存和准备就绪。容器在创建实体Bean对象实例后,通过unsetEntityContext(EntityContext ctx) 方法将上下文传递给实体Bean对象,实体Bean进入缓存的状态,此时的实体Bean可以通过主接口提供一些方法,当实体Bean对象被激活进入就绪状态时,ejbActivate()方法被调用,此时实体Bean的对象与实体Bean的主接口相联系,可以提供相应的业务方法。在执行与数据库的交互时,容器通过ejbStore()和ejbLoad()方法来维护实体Bean状态。当实体Bean对象被返回对象池之前ejbPassivate()方法被调用,同时实体Bean对象再次回到缓存状态,这就是常常说的“钝化”。当实体Bean对象对应的EJB对象被从对象池中删除之前,ejbRomove()方法会被调用。当实体Bean被从对象池中删除时,unsetEntityContext()用来除去实体Bean对象的上下文对象。
    
     3 本地接口与远程接口有什么区别?
       在EJB2.0中,也就是我们上课在学的(虽然EJB3.0已经出来了),实体Bean能够提供的客户端视图有两种:远程接口方式和本地接口方式。
       当实体Bean发布远程接口方式时,被调用实体Bean和客户端的位置是无关的,也就是他们可以运行在不同的JVM之上,即使客户断与EJB容器在同一JVM,对于调用者来说,与客户端在远程的情况是一样的。EJB服务器通过Java RMI技术来提供实体Bean的远程视图,在客户端调用实体Bean时将参数和结果在双方之间进行传递。
       当实体Bean发布本地接口方式时,调用实体Bean的过程就有了很大的不同。最直接的影响是,位于EJB服务器JVM以外的客户端无法调用到这个实体Bean。当实体Bean提供本地接口时,客户端与EJB服务器之间不需要RMI来进行远程调用,而是通过传递实体Bean对象引用方式实现的。

     4.主接口和对象接口又有什么区别?
       EJB服务容器为每个实体Bean提供主接口和对象接口。当提供远程视图时extends主接口(EJBHome)和远程对象接口(EJBObject);当提供本地视图时extends本地主接口(NodeLocalHome)和本地对象接口(EJBLocalObject)他们的作用是不同的。
       主接口的作用是向客户端提供创建实体Bean、查找实体Bean、删除实体Bean和执行主接口操作的方法。在主接口中可以提供若干个创建方法,方法名称是create(),可以对其进行重载,这些方法均返回实体Bean实例。主接口中还提供若干个查找方法,这些方法以“find”作为名称的前缀。查找方法可以由容器实现,也可以由实现类来实现,这与实体Bean的类型和开发者设计有关。主接口还提供了删除实体Bean的方法,由容器来执行所以主接口是客户端与服务器端之间实现交互的接口,客户端可以借助JNDI获取实体Bean的主接口,对于远程视图来说可以通过如下的方法完成:
           Context ctx = new InitialContext(env);
           Object objRef = ctx.lookup("cmp/node");
           NodeHome home = (NodeHome)narrow(objRef, NodeHome.class);
     对于本地视图来说可以通过如下方法来完成:
           Context ctx = new InitialContext(env);
           Object objRef = ctx.lookup("cmp/node");
           NodeHome home = (NodeHome)objRef;
     对象接口向客户端提供了实体Bean的主要业务方法,通过对象接口可以完成对数据的操作,也可以通过它得到主接口,或者删除实体Bean对象。

     5. 实体Bean的类型:BMP与CMP
      实体EJB分为CMP和BMP。CMP(Container-Managed Persistence)的数据操作方法有开发者通过配置文件描述
CMP类型的实体Bean是应用最多的实体Bean类型。他使得开发者不必再去和复杂的JDBC API程序打交道,就可以完成高质量的数据操作组件,并且在EJB2.0标准中对CMP的内容进行了一些扩充,主要包括对EJB-QL和
CMR(Container-Managed Relationships)的支持。这里就不多作介绍了。
     BMP(Bean-Managed Persistence)类型的实体Bean是EJB中的另一种类型的实体Bean,在BMP的实现方法中,需要借助于数据库API来实现数据的操作。与CMP相比,BMP的优势是在于可以更加灵活第提供数据库操作方法,特别是对不支持使用CMP的数据库产品。
     在实际应用,一般为了效率考虑,我们尽量使用CMP,但如何为将来有可能使用BMP作好准备,就是说有可以延伸到BMP的基础。EJB 2.0对CMP的抽象类支持为我们提供了这种实现的基础。总体思路是,先使用抽象类完成CMP如果需要BMP,可以extend这个抽象类,然后覆盖原来的方法(用自己的特殊SQL语句操作来覆盖该方法)。
   
     啰嗦了这么多,你是不是有一种感觉,事情至于这么复杂吗?呵呵,这也是实体Bean被人诟病的最大原因,它是一个重量级的架构,而且它规范太臃肿和丑陋了,所以导致了很多轻量级的解决方案的流行,例如著名的Hibernate,ibatis等等,但是只有知道它的不足才能设计出好的方法,也算是知己知彼了,还是慢慢打好基础吧。

分享到:
评论

相关推荐

    JBoss 实体Bean 及其接口的模版(实现JavaMail邮件的接收)

    在这个场景中,我们将讨论如何在JBoss环境中使用实体Bean(Entity Bean)及其接口来实现JavaMail邮件的接收。 首先,我们来看实体Bean。实体Bean是持久化的Java对象,它们代表数据库中的记录。在JBoss中,实体Bean...

    Java超全笔试题面试库及答案.doc

    f) EJB(企业级 Java Bean):作为 Model,可以封装数据(实体 Bean),也可以表示业务功能(会话 Bean),作为 Model,可以处理消息(MDB)。 g) UML(统一建模语言):提供画图的规范,如 Rose、Visio。 h) DTD...

    struts1+EJB3整合(AOP控制权限)

    JUnit是Java中最常用的单元测试框架,我们可以使用它来为EJB3的实体、会话bean或消息驱动bean编写测试用例。测试通常包括对bean的方法调用,模拟数据交互,验证结果和异常处理。在实际项目中,可能会结合Mockito等...

    Spring+mybatis环境搭建(包含jar包)

    6. **创建实体类**:根据数据库表结构创建对应的Java实体类。 7. **编写Mapper接口**:创建Mapper接口,定义数据库操作方法。例如: ```java public interface UserMapper { User getUserById(int id); } ```...

    使用SpringMVC做的小项目

    接下来,我们谈谈Hibernate,这是一个流行的对象关系映射(ORM)框架,用于简化数据库操作。在SpringMVC项目中,我们通常通过Spring的HibernateTemplate或JPA(Java Persistence API)来整合Hibernate。这些工具使得...

    使用Eclipse开发J2EE应用—集成Eclipse,Lomboz和JBoss.rar

    Lomboz还支持EJB的图形化编辑,使开发者可以直观地设计和管理实体Bean和会话Bean。 接下来,我们谈谈JBoss。JBoss是Red Hat公司的一个产品,它基于Java EE规范,提供了一个完整的应用服务器平台,支持Servlets、JSP...

    spring和hibernate、数据源所需要的jar包,内附一个小实例

    在实际项目中,开发者通常会创建一个配置文件(如`applicationContext.xml`和`hibernate.cfg.xml`),在其中定义数据源、SessionFactory、实体bean以及事务管理器等。然后,通过Spring的Bean定义,将这些组件注入到...

    视频播放及管理系统项目源码

    1. **src**目录:存放Java源代码,包括Struts的Action类、Spring的Bean配置、Hibernate的实体类以及业务逻辑处理类。 2. **webapp**目录:包含Web应用的所有资源,如JSP视图文件、静态资源(CSS、JavaScript)、...

    Java框架面试题总结

    - **Struts Bean标签库**:提供了一组用于处理Bean的操作标签,例如`<bean:message>`、`<bean:write>`等。 - `<bean:message>`:用于显示国际化消息。 - `<bean:write>`:输出Bean属性的值。 - `<bean:define>`:...

    ssm+redis二级缓存

    3. **MyBatis**:MyBatis是一个持久层框架,它允许开发者将SQL语句直接写在XML映射文件中,或者注解在Java实体类的方法上。MyBatis的核心是SqlSession,通过它可以执行SQL查询和更新操作。在本项目中,MyBatis与...

    spring-data-jpa-workshop:使用Spring Data JPA的示例

    接下来,我们谈谈实体类(Entity)。在Spring Data JPA中,实体类通常使用`@Entity`注解标识,并且需要有主键字段,如`@Id`注解的`id`字段。例如: ```java @Entity public class User { @Id @GeneratedValue...

    Java面试框架高频问题2019

    **问题一:谈谈你对Spring IOC和DI的理解,它们有什么区别?** - **IOC(Inversion of Control,控制反转)**: 是一种设计思想,用来降低代码之间的耦合度。在Spring框架中,通过依赖注入的方式实现了IOC。也就是说...

    Springboot 动态多数据源 jta分布式事务

    3. 注解配置:使用`@Configuration`、`@EnableJpaRepositories`、`@EntityScan`等注解,分别指定数据源、仓库接口和实体类的位置。 4. 自定义切换逻辑:编写代码来根据业务需求动态选择使用哪个数据源。 接下来,...

    SSH面试及笔试试题

    3. **Bean管理**:Spring容器负责创建、初始化、装配和管理Bean。 4. **数据访问**:Spring支持多种ORM框架,如Hibernate,提供JDBC模板简化数据库操作。 **Struts框架** Struts是MVC设计模式的一种实现,主要用于...

    java面试宝典

    抽象类是否可继承实体类(concrete class)? 12 41、Java 的接口和C++的虚类的相同和不同处。 12 42、一个“.java”源文件中是否可以包含多个类(不是内部类)?有什么限制? 12 43、说出一些常用的类,包,接口,请...

    试题库自动组卷系统的算法设计与实现

    接下来,我们谈谈Struts、Spring和Hibernate这三个技术如何协同工作来实现系统: - **Struts**:作为MVC(Model-View-Controller)框架的一部分,负责处理用户请求,协调模型和视图,提供了一种结构化的控制层解决...

    kotlin spring boot 初始化脚手架

    4. **编写实体类**:使用Kotlin的数据类表示数据库表对应的实体。 5. **创建Mapper接口**:定义与数据库交互的Mapper接口,使用Mybatis Plus的注解指定表名和主键。 6. **编写Service**:实现业务逻辑,利用...

    spring4+mybatis框架构建

    6. **编写实体类**:根据数据库表结构,创建对应的Java实体类。 7. **服务层设计**:创建Service接口和实现类,使用@Autowired注解注入Mapper,通过Mapper进行数据库操作。 8. **测试**:编写JUnit测试用例,验证...

    SSHConformity【display标签和taglib标签缺架包】,ssh整合,分页,display标签,pager-taglib标签

    3. 配置Hibernate:设置Hibernate的配置文件,包括数据库连接、实体映射等,并在Spring中管理SessionFactory。 接下来,我们来谈谈分页功能。在Web应用中,特别是数据量大的场景,分页展示是非常必要的。Display ...

Global site tag (gtag.js) - Google Analytics