我完全是EJB技术的新手,所以最近我开始学习EJB3.0,当我阅读书籍/在线资源时,我发现了许多与EJB2.0的引用和比较,以及EJB3.0如何通过要求开发人员创建发热组件来简化事情。我放弃了对EJB3.0的阅读,开始阅读EJB2.0。我从版的"Enterprise“一书开始,这本书很旧(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>在单向关系中,客户EJB具有关系字段homeAddress。在数据库表中,客户有一个列ADDRESS_ID。何时建立homeAddress与ADDRESS_ID之间的映射。
对于双向关系字段,这两个关系角色都有在部署描述符中定义的元素,但是在实际的数据库表中,只有一个表持有外键(在多个关系角色和一个可能的情况下),我们需要从其他关系角色映射到任何列吗?
双向一对一
<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>customer EJB具有relationship字段creditCard,而CreditCard EJB具有relationship字段Customer。在数据库中,CUSTOMER表有列CREDITCARD_ID,而CREDIT_CARD表有列CUSTOMER_ID。客户表是否需要CREDITCARD_ID列。抽象模式是否总是必须精确地映射到数据库模式?这种关系是在部署时建立的吗?
发布于 2013-05-31 14:37:29
是的,从CMP元数据到DB表的映射是在部署时使用特定于供应商的工具进行的。来自EJB3.0规范:
EJB2.1实体bean的EJB部署描述符描述实体bean之间的逻辑关系。它没有提供一种机制来指定如何将实体bean或一组相关实体bean的抽象持久性模式映射到底层数据库。这是Deployer的责任,他使用Container的工具,使用部署描述符中指定的逻辑关系映射到特定于底层资源的物理关系。
https://stackoverflow.com/questions/16838495
复制相似问题