⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ejb2_0中的变化增强,应用程序开发的灵活性和可移植性2.htm

📁 写给JSP初级程序员的书
💻 HTM
📖 第 1 页 / 共 2 页
字号:
<META content="MSHTML 5.00.2920.0" name=GENERATOR></HEAD>
<BODY bgColor=#ffffff text=#000000>
<table>
  <table><tbody>
  <TR>
    <TD height=21>
      <DIV align=center><B><FONT size=3>EJB2.0中的变化增强,应用程序开发的灵活性和可移植性2 <BR><FONT size=2> </FONT></FONT></FONT>
      <HR align=center color=#cccccc noShade SIZE=1>
      </DIV></TD></TR>
  <TR>
    <TD class=line><FONT 
      color=#333300><BR><BR>bean&nbsp;类的继承层次结构&nbsp;<BR><BR><BR>为了使讨论更充实,这里提供一个&nbsp;CMP&nbsp;实体的示例,它更具体地说明了抽象持久性方案是如何工作的。&nbsp;<BR><BR>EJB&nbsp;2.0&nbsp;中的一个示例&nbsp;CMP&nbsp;实体&nbsp;<BR>在&nbsp;EJB&nbsp;2.0&nbsp;中,容器管理的实体&nbsp;bean&nbsp;被定义为抽象的,而且它的持久性字段并不在&nbsp;bean&nbsp;类中直接定义。作为替代,开发了一种抽象的持久性方案,从而允许&nbsp;bean&nbsp;提供者间接地声明持久性字段和&nbsp;bean&nbsp;关系。下面是&nbsp;Employee&nbsp;bean&nbsp;的一个示例,它使用了新的抽象持久性方案。请注意,该&nbsp;bean&nbsp;类中未声明任何持久性字段。&nbsp;<BR><BR>public&nbsp;abstract&nbsp;EmployeeBean&nbsp;implements&nbsp;<BR>javax.ejb.EntityBean&nbsp;{&nbsp;<BR>.&nbsp;//&nbsp;实例字段&nbsp;<BR>EntityContext&nbsp;ejbContext;&nbsp;<BR><BR>//&nbsp;容器管理的持久性字段&nbsp;<BR>public&nbsp;abstract&nbsp;void&nbsp;setIdentity(int&nbsp;<BR>identity);&nbsp;<BR>public&nbsp;abstract&nbsp;int&nbsp;getIdentity();&nbsp;<BR>public&nbsp;abstract&nbsp;void&nbsp;setFirstName(String&nbsp;<BR>firstName);&nbsp;<BR>public&nbsp;abstract&nbsp;String&nbsp;getFirstName();&nbsp;<BR>public&nbsp;abstract&nbsp;void&nbsp;setLastName(String&nbsp;<BR>lastName);&nbsp;<BR>public&nbsp;abstract&nbsp;String&nbsp;getLastName();&nbsp;<BR><BR>//&nbsp;容器管理的关系字段&nbsp;<BR>public&nbsp;abstract&nbsp;void&nbsp;<BR>setContactInfo(ContactInfo&nbsp;info);&nbsp;<BR>public&nbsp;abstract&nbsp;ContactInfo&nbsp;<BR>getContactInfo();&nbsp;<BR><BR>...&nbsp;<BR>}&nbsp;<BR><BR><BR>在此&nbsp;bean&nbsp;的&nbsp;XML&nbsp;部署描述符中,抽象的持久性方案声明容器管理的各个字段和各种关系。&nbsp;<BR><BR>&lt;ejb-jar&gt;&nbsp;<BR>&lt;enterprise-beans&gt;&nbsp;<BR>&lt;entity&gt;&nbsp;<BR>&lt;ejb-name&gt;EmployeeEJB&lt;/ejb-name&gt;&nbsp;<BR>...&nbsp;<BR>&lt;persistence-type&gt;Container&lt;/persistence-type&gt;&nbsp;<BR><BR>...&nbsp;<BR>&lt;cmp-field&gt;&lt;field-name&gt;identity&lt;/field-name&gt;&lt;/cmp-field&gt;&nbsp;<BR><BR>&lt;cmp-field&gt;&lt;field-name&gt;firstName&lt;/field-name&gt;&lt;/cmp-field&gt;&nbsp;<BR><BR>&lt;cmp-field&gt;&lt;field-name&gt;lastName&lt;/field-name&gt;&lt;/cmp-field&gt;&nbsp;<BR><BR>...&nbsp;<BR>&lt;/entity&gt;&nbsp;<BR>&lt;/enterprise-beans&gt;&nbsp;<BR>&lt;dependents&gt;&nbsp;<BR>&lt;dependent&gt;&nbsp;<BR>&lt;dependent-class&gt;ContactInfo&lt;/dependent-class&gt;&nbsp;<BR><BR>&lt;dependent-name&gt;ContactInfo&lt;/dependent-name&gt;&nbsp;<BR><BR>&lt;cmp-field&gt;street&lt;/cmp-field&gt;&nbsp;<BR>&lt;cmp-field&gt;city&lt;/cmp-field&gt;&nbsp;<BR>&lt;cmp-field&gt;state&lt;/cmp-field&gt;&nbsp;<BR>&lt;cmp-field&gt;zip&lt;/cmp-field&gt;&nbsp;<BR>&lt;cmp-field&gt;homePhone&lt;/cmp-field&gt;&nbsp;<BR>&lt;cmp-field&gt;workPhone&lt;/cmp-field&gt;&nbsp;<BR>&lt;cmp-field&gt;email&lt;/cmp-field&gt;&nbsp;<BR>...&nbsp;<BR>&lt;/dependent&gt;&nbsp;<BR>&lt;relationships&gt;&nbsp;<BR>&lt;ejb-relation&gt;&nbsp;<BR>&lt;ejb-relation-name&gt;Employee-ContactInfo&lt;/ejb-relation-name&gt;&nbsp;<BR><BR>&lt;ejb-relationship-role&gt;&nbsp;<BR>&lt;ejb-relationship-role-name&gt;&nbsp;<BR>employee-has-contactinfo&nbsp;<BR><BR>&lt;/ejb-relationship-role-name&gt;&nbsp;<BR>&lt;multiplicity&gt;one&lt;/multiplicity&gt;&nbsp;<BR>&lt;role-source&gt;&nbsp;<BR>&lt;ejb-name&gt;EmployeeEJB&lt;/ejb-name&gt;&nbsp;<BR><BR>&lt;/role-source&gt;&nbsp;<BR>&lt;cmr-field&gt;&nbsp;<BR>&lt;cmr-field-name&gt;contactInfo&lt;/cmr-field-name&gt;&nbsp;<BR><BR>&lt;cmr-field-type&gt;ContactInfo&lt;/cmr-field-type&gt;&nbsp;<BR><BR>&lt;/cmr-field&gt;&nbsp;<BR>&lt;/ejb-relationship-role&gt;&nbsp;<BR>&lt;ejb-relationship-role&gt;&nbsp;<BR>&lt;ejb-relationship-role-name&gt;&nbsp;<BR>contactinfo_belongsto_employee&nbsp;<BR><BR>&lt;/ejb-relationship-role-name&gt;&nbsp;<BR>&lt;multiplicity&gt;one&lt;/multiplicity&gt;&nbsp;<BR>&lt;role-source&gt;&nbsp;<BR>&lt;dependent-name&gt;ContactInfo&lt;dependent-name&gt;&nbsp;<BR><BR>&lt;/role-source&gt;&nbsp;<BR>&lt;/ejb-relationship-role&gt;&nbsp;<BR>&lt;/ejb-relation&gt;&nbsp;<BR>&lt;/relationships&gt;&nbsp;<BR>&lt;ejb-jar&gt;&nbsp;<BR><BR><BR><BR>用来描述容器管理的关系的&nbsp;XML&nbsp;元素可能变得非常复杂,因为他们必须处理各种关系的对应性和方向(单向的还是双向的)。上面的代码段说明,为了描述&nbsp;bean&nbsp;与其从属对象类之间的简单关系,您需要哪些元素。虽然即使是简单的关系也会被转换为冗长的&nbsp;XML,但所有这些元素都是必需的,以便持久性管理器能够将复杂的对象图映射到数据库中。&nbsp;<BR><BR>虽然用于定义&nbsp;CMP&nbsp;bean&nbsp;的抽象持久性方案的&nbsp;XML&nbsp;元素是&nbsp;EJB&nbsp;2.0&nbsp;中的&nbsp;CMP&nbsp;的主要问题,但为了简洁起见,本文不再提供&nbsp;XML&nbsp;示例。作为替代,本文将纯粹依靠&nbsp;bean&nbsp;类中必须使用的抽象习语,来说明&nbsp;EJB&nbsp;2.0&nbsp;中的&nbsp;CMP&nbsp;背后的基本概念。这些代码习语与&nbsp;XML&nbsp;部署描述符中的关系元素一起使用,并由后者定义,所以您不能只有其一而没有另一个,但它们比该方案的&nbsp;XML&nbsp;部分较容易理解。&nbsp;<BR><BR>除了&nbsp;XML&nbsp;元素之外,抽象的持久性方案还定义了一组习语,它们在声明&nbsp;bean&nbsp;类及其相关的对象时必然会用到。用来访问和修改字段的方法是严格定义了的,要求用&nbsp;set&lt;METHOD&gt;&nbsp;方法修改持久性字段,而用&nbsp;get&lt;METHOD&gt;&nbsp;方法访问它们。这些方法的名称和返回类型由部署描述符中它们相应的&nbsp;XML&nbsp;关系元素规定。&nbsp;<BR><BR>实体&nbsp;bean&nbsp;类和从属类都遵循相同的抽象持久性方案。下面是如何将&nbsp;ContactInfo&nbsp;对象定义为从属对象类的示例。&nbsp;<BR><BR>public&nbsp;abstract&nbsp;class&nbsp;ContactInfo&nbsp;{&nbsp;<BR>//&nbsp;家庭地址信息&nbsp;<BR>public&nbsp;abstract&nbsp;void&nbsp;setStreet(String&nbsp;street);&nbsp;<BR>public&nbsp;abstract&nbsp;String&nbsp;getStreet();&nbsp;<BR>public&nbsp;abstract&nbsp;void&nbsp;setState(String&nbsp;state);&nbsp;<BR>public&nbsp;abstract&nbsp;String&nbsp;getState();&nbsp;<BR>public&nbsp;abstract&nbsp;void&nbsp;setZip(String&nbsp;zip);&nbsp;<BR>public&nbsp;abstract&nbsp;String&nbsp;getZip();&nbsp;<BR>public&nbsp;abstract&nbsp;void&nbsp;setHomePhone(String&nbsp;phone);&nbsp;<BR>public&nbsp;abstract&nbsp;String&nbsp;getHomePhone();&nbsp;<BR><BR>//&nbsp;工作地址信息&nbsp;<BR>public&nbsp;abstract&nbsp;void&nbsp;setWorkPhone(String&nbsp;phone);&nbsp;<BR>public&nbsp;abstract&nbsp;String&nbsp;getWorkPhone();&nbsp;<BR>public&nbsp;abstract&nbsp;void&nbsp;setEMail(String&nbsp;email);&nbsp;<BR>public&nbsp;abstract&nbsp;String&nbsp;getEMail();&nbsp;<BR>...&nbsp;<BR>}&nbsp;<BR><BR><BR><BR>从属对象随实体&nbsp;bean&nbsp;的存在而存在,随实体&nbsp;bean&nbsp;的中止而中止,这是理解从属对象与实体&nbsp;bean&nbsp;之间关系的关键。从属对象包含在一个具体的实体中,所以删除这个实体将导致从属对象也被删除。用关系数据库的术语来说,有时这就称为级联删除。&nbsp;<BR><BR>从属对象,如&nbsp;ContactInfo,用在关系字段中。与实体&nbsp;bean&nbsp;形成关系的从属对象技术上称为从属对象类。EJB&nbsp;客户端应用程序永远不能直接访问从属对象类;这种类不能用作&nbsp;bean&nbsp;的远程或本地接口中的参数或返回值。从属对象类只对&nbsp;bean&nbsp;类才是可见的。&nbsp;<BR><BR>从属对象类不适合作为远程参数类型,因为它们与&nbsp;bean&nbsp;在运行时的持久性逻辑有密切的联系。持久性管理器扩展了抽象的从属对象类,以便能提供一种实现,可用于在运行时管理&nbsp;bean&nbsp;的持久性状态。此外,抽象的持久性方案还为数据建模&nbsp;--&nbsp;而不是为那些由企业级&nbsp;bean&nbsp;表示的业务概念建模&nbsp;--&nbsp;所以,作为一种设计策略,将抽象的持久性方案对&nbsp;EJB&nbsp;客户机隐藏起来是有意义的。&nbsp;<BR><BR>例如,ContactInfo&nbsp;关系字段中除了&nbsp;bean&nbsp;的客户机所需的简单地址信息之外,还包含许多其它信息。虽然您可以使用抽象持久性方案中的从属对象类&nbsp;ContactInfo(它对&nbsp;bean&nbsp;的客户机是隐藏的),但是,您得用其它的对象来把这些数据实际表露给客户机。下面是一个示例,说明了如何对&nbsp;EJB&nbsp;客户机隐藏&nbsp;ContactInfo&nbsp;从属对象。在此例中,地址信息是通过在&nbsp;EJB&nbsp;1.1&nbsp;的示例中开发的&nbsp;Address&nbsp;对象来表露的。&nbsp;<BR><BR>//&nbsp;Employee&nbsp;bean&nbsp;的远程接口&nbsp;<BR>public&nbsp;interface&nbsp;Employee&nbsp;extends&nbsp;javax.ejb.EJBObject&nbsp;{&nbsp;<BR><BR>public&nbsp;Address&nbsp;getHomeAddress();&nbsp;<BR>public&nbsp;void&nbsp;setHomeAddress(Address&nbsp;address);&nbsp;<BR><BR>public&nbsp;int&nbsp;getIdentity()&nbsp;throws&nbsp;RemoteException;&nbsp;<BR>public&nbsp;void&nbsp;setFirstName(String&nbsp;firstName)&nbsp;throws&nbsp;<BR>RemoteException;&nbsp;<BR>public&nbsp;String&nbsp;getFirstName()throws&nbsp;RemoteException;&nbsp;<BR>public&nbsp;void&nbsp;setLastName(String&nbsp;lastName)&nbsp;throws&nbsp;<BR>RemoteException;&nbsp;<BR>public&nbsp;String&nbsp;getLastName()&nbsp;throws&nbsp;RemoteException;&nbsp;<BR>}&nbsp;<BR><BR>//&nbsp;Employee&nbsp;bean&nbsp;的&nbsp;bean&nbsp;类&nbsp;<BR>public&nbsp;abstract&nbsp;EmployeeBean&nbsp;implements&nbsp;<BR>javax.ejb.EntityBean&nbsp;{&nbsp;<BR>...&nbsp;<BR>public&nbsp;Address&nbsp;getHomeAddress(){&nbsp;<BR>ContactInfo&nbsp;info&nbsp;=&nbsp;getContactInfo();&nbsp;<BR>Address&nbsp;addr&nbsp;=&nbsp;new&nbsp;Address();&nbsp;<BR>addr.street&nbsp;=&nbsp;info.getStreet();&nbsp;<BR>addr.city&nbsp;=&nbsp;info.getCity();&nbsp;<BR>addr.state&nbsp;=&nbsp;info.getState();&nbsp;<BR>addr.zip&nbsp;=&nbsp;info.getZip();&nbsp;<BR>return&nbsp;addr;&nbsp;<BR>}&nbsp;<BR>public&nbsp;void&nbsp;setHomeAddress(Address&nbsp;addr){&nbsp;<BR>ContactInfo&nbsp;info&nbsp;=&nbsp;getContactInfo();&nbsp;<BR>info.setStreet(addr.street);&nbsp;<BR>info.getCity(addr.city);&nbsp;<BR>info.getState(addr.state);&nbsp;<BR>info.getZip(addr.zip);&nbsp;<BR>}&nbsp;<BR>....&nbsp;<BR>//&nbsp;容器管理的关系字段&nbsp;<BR>public&nbsp;abstract&nbsp;void&nbsp;setContactInfo(ContactInfo&nbsp;<BR>info);&nbsp;<BR>public&nbsp;abstract&nbsp;ContactInfo&nbsp;getContactInfo();&nbsp;<BR>...&nbsp;<BR>}&nbsp;<BR><BR><BR><BR>尽管容器管理的关系字段没有表露给客户机,但您仍然可以从远程接口直接使用容器管理的持久性字段。请注意,用来访问&nbsp;firstName&nbsp;和&nbsp;lastName&nbsp;的容器管理的持久性字段是在远程接口中使用的。&nbsp;<BR><BR>一个&nbsp;bean&nbsp;与各种从属对象类之间可能具有多种不同的关系,它们由这种关系的对应性和方向来定义。Bean&nbsp;与从属对象类之间可以有一对多和一对一的关系。例如,Employee&nbsp;bean&nbsp;可能仅有一个&nbsp;Benefit&nbsp;从属对象类,但可能有许多&nbsp;ContactInfo&nbsp;从属对象类。&nbsp;<BR><BR>public&nbsp;abstract&nbsp;EmployeeBean&nbsp;implements&nbsp;<BR>javax.ejb.EntityBean&nbsp;{&nbsp;<BR>...&nbsp;<BR>public&nbsp;abstract&nbsp;void&nbsp;setContactInfos(Collection&nbsp;<BR>addresses);&nbsp;<BR>public&nbsp;abstract&nbsp;Collection&nbsp;getContactInfos():&nbsp;<BR><BR>public&nbsp;abstract&nbsp;void&nbsp;setBenefit(Benefit&nbsp;benefit);&nbsp;<BR><BR>public&nbsp;abstract&nbsp;Benefit&nbsp;getBenefit();&nbsp;<BR>...&nbsp;<BR>}&nbsp;<BR><BR><BR>与从属对象类的一对多关系既可表示为&nbsp;java.util.Collection&nbsp;类型,也可表示为&nbsp;ava.util.Set&nbsp;类型(注:在本规范的后续版本中,java.util.Map&nbsp;和&nbsp;java.util.List&nbsp;被视为附加的返回类型),而与从属对象的一对一关系则使用从属对象的类型。&nbsp;<BR><BR>实体&nbsp;bean&nbsp;也可以定义与其它实体&nbsp;bean&nbsp;的关系。这些关系可以是一对一、一对多或多对多。例如,Employee&nbsp;bean&nbsp;可能有许多子级&nbsp;bean,而只有一个配对的&nbsp;bean。下面的代码段使用抽象持久性方案的方法习语,说明了如何为这些关系建模。该应用程序中,子级&nbsp;bean&nbsp;和配对的&nbsp;bean&nbsp;都表现为&nbsp;Person&nbsp;bean。&nbsp;<BR><BR>public&nbsp;abstract&nbsp;EmployeeBean&nbsp;implements&nbsp;<BR>javax.ejb.EntityBean&nbsp;{&nbsp;<BR><BR>...&nbsp;<BR>public&nbsp;abstract&nbsp;void&nbsp;setSpouse(Person&nbsp;manager);&nbsp;<BR>public&nbsp;abstract&nbsp;Person&nbsp;getSpouse();&nbsp;<BR><BR>public&nbsp;abstract&nbsp;void&nbsp;setChildren(Collection&nbsp;<BR>family);&nbsp;<BR>public&nbsp;abstract&nbsp;Collection&nbsp;getChildren();&nbsp;<BR>...&nbsp;<BR>}&nbsp;<BR><BR><BR><BR>与另一个&nbsp;bean&nbsp;的一对多关系表示为&nbsp;java.util.Collection&nbsp;类型或&nbsp;java.util.Set&nbsp;类型,而一对一关系则使用该&nbsp;bean&nbsp;的远程接口类型。&nbsp;<BR><BR>从属对象本身与同一个&nbsp;bean&nbsp;中的其它从属对象之间可以有一对一、一对多和多对多的关系。此外,从属对象与其它实体&nbsp;bean(除其父级&nbsp;bean&nbsp;之外)也可以有一对一、一对多的关系。下面的示例显示,Benefit&nbsp;从属对象类与&nbsp;Salary&nbsp;从属对象(一种报酬计算程序)之间怎样具有一对一的关系,而与&nbsp;Investment&nbsp;bean&nbsp;又怎样具有一对多的关系。&nbsp;<BR><BR>public&nbsp;abstract&nbsp;class&nbsp;Benefit&nbsp;{&nbsp;<BR>public&nbsp;abstract&nbsp;void&nbsp;setSalary(Salary&nbsp;salary);&nbsp;<BR>public&nbsp;abstract&nbsp;Salary&nbsp;getSalary();&nbsp;<BR><BR>public&nbsp;abstract&nbsp;void&nbsp;setInvestments(Collection&nbsp;<BR>investments);&nbsp;<BR>public&nbsp;abstract&nbsp;Collection&nbsp;getInvestments();&nbsp;<BR>}&nbsp;<BR></FONT></TD></TR>
  <TR>
    <TD height=5>
      <HR align=center color=#cccccc noShade SIZE=1>
    </TD></TR></TBODY></BODY></HTML>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -