我是EJB技术的新手,所以最近我开始学习EJB3.0,在阅读书籍/在线资源时,我发现了许多对EJB2.0的引用和比较以及EJB3.0如何通过要求开发人员简化事物制造发烧成分。我离开了阅读EJB3.0并开始阅读EJB2.0。我开始阅读“Richard Monson-Haefel III Edition的Enterprise Java Beans”这本非常古老的版本(2000),但它非常全面。在容器管理关系之前我对这些事情了如指掌。我发现通过抽象持久性模型(抽象访问器方法)和抽象模式(部署描述符),在两个实体bean之间建立了关系。我还发现,对于实体bean的持久性字段,在部署时,在虚拟持久字段和实际数据库表列之间建立映射。何时为虚拟关系字段建立此类映射,是否仅在部署时? 单向一对一
<ejb-jar>
<enterprise-beans>
<entity>
<ejb-name>CustomerEJB</ejb-name>
<home>com.titan.customer.CustomerHomeRemote</home>
<remote>com.titan.customer.CustomerRemote</remote>
<ejb-class>com.titan.customer.CustomerBean</ejb-class>
<persistence-type>Container</persistence-type>
<prim-key-class>java.lang.Integer</prim-key-class>
<reentrant>False</reentrant>
<cmp-version>2.x</cmp-version>
<abstract-schema-name>Customer</abstract-schema-name>
<cmp-field><field-name>id</field-name></cmp-field>
<cmp-field><field-name>lastName</field-name></cmp-field>
<cmp-field><field-name>firstName</field-name></cmp-field>
<primkey-field>id</primkey-field>
<security-identity><use-caller-identity/></security-identity>
</entity>
<entity>
<ejb-name>AddressEJB</ejb-name>
<local-home>com.titan.address.AddressHomeLocal</local-home>
<local>com.titan.address.AddressLocal</local>
<ejb-class>com.titan.address.AddressBean</ejb-class>
<persistence-type>Container</persistence-type>
<prim-key-class>java.lang.Integer</prim-key-class>
<reentrant>False</reentrant>
<cmp-version>2.x</cmp-version>
<abstract-schema-name>Address</abstract-schema-name>
<cmp-field><field-name>id</field-name></cmp-field>
<cmp-field><field-name>street</field-name></cmp-field>
<cmp-field><field-name>city</field-name></cmp-field>
<cmp-field><field-name>state</field-name></cmp-field>
<cmp-field><field-name>zip</field-name></cmp-field>
<primkey-field>id</primkey-field>
<security-identity><use-caller-identity/></security-identity>
</entity>
</enterprise-beans>
<relationships>
<ejb-relation>
<ejb-relation-name>Customer-Address</ejb-relation-name>
<ejb-relationship-role>
<ejb-relationship-role-name>Customer-has-an-Address</ejb-relationship-role-name>
<multiplicity>One</multiplicity>
<relationship-role-source>
<ejb-name>CustomerEJB</ejb-name>
</relationship-role-source>
<cmr-field>
<cmr-field-name>homeAddress</cmr-field-name>
</cmr-field>
</ejb-relationship-role>
<ejb-relationship-role>
<ejb-relationship-role-name>Address-belongs-to-Customer</ejb-relationship-role-name>
<multiplicity>One</multiplicity>
<relationship-role-source>
<ejb-name>AddressEJB</ejb-name>
</relationship-role-source>
</ejb-relationship-role>
</ejb-relation>
</relationships>
</ejb-jar>
在单向关系中,Customer EJB具有关系字段homeAddress。在数据库表中,CUSTOMER有一列ADDRESS_ID。什么时候homeAddress和amp;之间的映射。 ADDRESS_ID已建立。
对于双向关系字段,其中两个关系角色都具有在deployement描述符中定义的元素,但在实际数据库表中只有一个表包含外键(如果是多个和一个可能),我们是否需要从其他关系角色映射到任何列?
双向一对一
<relationships>
<ejb-relation>
<ejb-relation-name>Customer-CreditCard</ejb-relation-name>
<ejb-relationship-role>
<ejb-relationship-role-name>Customer-has-a-CreditCard</ejb-relationship-role-name>
<multiplicity>One</multiplicity>
<relationship-role-source>
<ejb-name>CustomerEJB</ejb-name>
</relationship-role-source>
<cmr-field>
<cmr-field-name>creditCard</cmr-field-name>
</cmr-field>
</ejb-relationship-role>
<ejb-relationship-role>
<ejb-relationship-role-name>CreditCard-belongs-to-Customer</ejb-relationship-role-name>
<multiplicity>One</multiplicity>
<relationship-role-source>
<ejb-name>CreditCardEJB</ejb-name>
</relationship-role-source>
<cmr-field>
<cmr-field-name>customer</cmr-field-name>
</cmr-field>
</ejb-relationship-role>
</ejb-relation>
</relationships>
客户EJB有关系字段creditCard,而CreditCard EJB有关系字段客户。在数据库中,CUSTOMER表具有列CREDITCARD_ID,而CREDIT_CARD表具有列CUSTOMER_ID。 CUSTOMER表是否需要具有CREDITCARD_ID列。是否始终需要抽象模式完全映射到数据库模式?这种关系是否在部署时建立?
答案 0 :(得分:0)
是的,从CMP元数据到数据库表的映射在部署时使用特定于供应商的工具进行。从EJB 3.0规范:
EJB 2.1实体bean的EJB部署描述符描述 实体bean之间的逻辑关系。它没有提供 用于指定抽象持久性模式的机制 实体bean或一组相互关联的实体bean将被映射 到底层数据库。这是部署者的责任, 谁使用Container Provider的工具,使用逻辑 要映射的部署描述符中指定的关系 特定于底层的物理关系 资源。