EJB2.x容器管理关系

时间:2013-05-30 14:10:46

标签: ejb-2.x

我是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列。是否始终需要抽象模式完全映射到数据库模式?这种关系是否在部署时建立?

1 个答案:

答案 0 :(得分:0)

是的,从CMP元数据到数据库表的映射在部署时使用特定于供应商的工具进行。从EJB 3.0规范:

  

EJB 2.1实体bean的EJB部署描述符描述   实体bean之间的逻辑关系。它没有提供   用于指定抽象持久性模式的机制   实体bean或一组相互关联的实体bean将被映射   到底层数据库。这是部署者的责任,   谁使用Container Provider的工具,使用逻辑   要映射的部署描述符中指定的关系   特定于底层的物理关系   资源。