当前位置:编程学习 > JSP >>

使用EJB3.O简化EJB开发(三)

答案:

简化持久化容器管理

CMP实体bean将成为EJB3.0使得开发人员强制使用的一个主要的检查方式。持久化框架象如OracleAS TopLink, 开源的Hibernate已经成为不像实体bean本质上的复杂和重量级的开发J2EE持久化框架应用的被大家喜爱的方式。 EJB3.0采纳了如TopLink和Hibernate轻量级的持久化模式来简化容器持久化管理,这些听起来更让开发人员们欣喜。让我们简单的浏览一下实体bean的计划,我们将在另外的文章中讨论持久化改进的细节。

实体bean作为POJOs已经改头换面,实体bean将不在需要组件接口。实体bean现在看起来是支持继承和多态的纯粹的对象。

下面的是关于实体bean源代码

@Entity public class Employee{

  private Long empNo;

  private String empName;

  private Address address;

  private Hashmap projects = new Hashmap();

  private Double salary;

  @Id(generate=SEQUENCE) public Long getEmpNo() {

  return empNo;

  }

  protected void setEmpNo(Long empNo) {

  this.empNo = empNo;

  }

  public String getEmpName() {

  return EmpName;

  }

  public void setEmpName(String EmpName){

  this.EmpName = EmpName;

  }

  @Dependent public Address getAddress() {

  return address;

  }

  public void setAddress(Address address) {

  this.address = address;

  }

  public Set getProjects() {

  return projects;

  }

  public void setProjects(Set projects) {

  this.projects = projects;

  }

  public Double getSalary() {

  return salary;

  }

  public void setSalary(Double salary) {

  this.salary = salary;

  }

  ....

  }

如果你仔细看这些代码,你可以发现在现在的实体bean中bean类是一个具体的类而不再是一个抽象类。

EJB QL和实体bean的SQL查询做了多项改进。类似于Hibernate的新的实体管理API和简化版的TopLink的会话API被建议用来处理实体bean的操作,也就是实体bean的创建,释放,查找。

我们将在深入的文章中进一步对建议CMP实体bean的细节做更多的验证。

简化EJB客户端

即使应用中EJB是序列化的,使用EJB也就是寻找和调用也是非常复杂的。J2EE 1.4 和 EJB 3.0规范致力于简化EJB客户端。

如果目前你希望使用EJB你必须在部署描述中定义EJB引用或者EJB本地引用,寻找到EJB然后调用。如果我们希望调用HelloWorld 的EJB,你可以按照下面的简单方法调用EJB使用已存在的实现。

如下在部署描述中找到EJB指示的定义

<ejb-ref>

  <ejb-ref-name>HelloWorldEJB</ejb-ref-name>

  <ejb-ref-type>Session</ejb-ref-type>

  <home>hello.HelloWorldHome</home>

  <remote> hello.HelloWorld</remote>

  </ejb-ref>

然后按照如下方法寻找EJB.你需要明确处理EJB查找和建立一个bean实例时的异常。

try

  {

    Context context = new InitialContext();

               HelloWorldHome helloHome =

                 (HelloWorld)PortableRemoteObject.narrow(context.lookup

     ("java:comp/env/ejb/HelloWorldEJB"), HelloWorldHome.class);

               HelloWorld hello = helloHome.create();

                 ....

   }

    catch(RemoteException e)

               {

                 System.err.println("System/communication error: " + e.getMessage());

               }

               catch(NamingException e)

               {

                 System.err.println("Communication error: " + e.getMessage());

               }

               catch(CreateException e)

               {

                 System.err.println("Error creating EJB instance: " + e.getMessage());

               }

如一个环境变量的变化一样,EJB3.0建议使用安放injection的方法查找和调用EJB.

下面我们使用安放injection的方法在另一个EJB查找HelloWorldEJB。

@Inject private void setSessionContext(SessionContext ctx)

  {

  this.ctx = ctx

  }

  ...

  myHello = (HelloWorld)ctx.lookup("java:comp/env/ejb/HelloWorldEJB");

如果你仔细查看上面的代码,它依赖的injection使用@Injectset来的指定对SessionContext方法的annotations。injection 方法将可以在业务方法被EJB调用前被容器调用来设定EJBContext。

另一个injected 的HelloWorld会话bean的直接的范例可以简化为使用

@EJB public HelloWorld myHello,这将使得myHello被HelloWorld bean的实例injected 。

你可以使用依赖的injection来查询任何类型的环境和资源参考如DataSource, JMS, Mail, Web Service等等。

容器外部测试可行性

一个现在EJB开发者所关注的不仅仅是EJB开发的复杂,也包括了测试的可怕之处。开发和测试EJB必须需要一个EJB容器并且开发人员必须熟悉最终部署平台才可以执行测

上一个:J2EE的13种核心技术(一)
下一个:使用EJB3.O简化EJB开发(二)

CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,