本人学习EJB也有一年多的时间了,前段时间公司接到一个大的项目才真正的用到,客户使用的Weblogic 7.0,数据库用的是SQL Server 2000,所以我只能正对Weblogic+SQL Server 2000的环境来做说明。 
       首先,在Weglogic中配置数据源,在Weblogic中有Sql Server 2000的JDBC,所以就可以直接使用,注意,在EJB中一定要使用Tx-DataSource,另外,还要对Sql Server 2000数据库打一个JTA的补丁,这样才能更好的支持分布式事务的处理。 
       下面,我就对我们系统中的一个认证子系统做一个简单的介绍,(参考:http://www-900.ibm.com/developerWorks/cn/cnedu.nsf/java-onlinecourse-bytitle/991A4E2DCA2D6CE148256BCE00135FAE?OpenDocument)我基本上是根据这个例子来做的。 
       在本子系统中,LocalUserBean(实体)用来验证用户身份,UserInfoBean(实体)用户详细信息,UserGroupBean(实体)用户分组,LocalRoleBean(实体)用户角色,UserManageBean(会话)该子系统的唯一远程接口。 
       关系:LocalUserBean ----- UserInfoBean 是 one2one的单相关系,UserGroupBean----LocalUserBean是one2many的双相关系,LocalUserBean----LocalRoleBean是many2many的双相关系。 
       LocalUserBean----UserInfoBean:一对一的关系比较简单 
  LocalUserBean的字段 (CMP) 
  public abstract void setEmail(java.lang.String email); 
  public abstract void setPw(java.lang.String pw); 
  public abstract java.lang.String getEmail(); 
  public abstract java.lang.String getPw(); 
  
  与UserInfo建立关系 (CMR) 
  public abstract void setUserInfo(usermanagesample.UserInfo userInfo); 
  public abstractUserInfo getUserInfo(); 
  
UserInfoBean的字段 (CMP) 
  public abstract void setEmail(java.lang.String email); 
  public abstract void setDept(java.lang.String dept); 
  public abstract void setName(java.lang.String Name); 
              …… 
  public abstract java.lang.String getEmail(); 
  public abstract java.lang.String getDept(); 
  public abstract java.lang.String getName(); 
       …… 
 由于关系是单的,所以UserInfoBean没有CMR字段。 
  
 Weblogic-cmp-rdbms-jar.xml 
   <weblogic-rdbms-bean> 
        <ejb-name>LocalUser</ejb-name> 
        <data-source-name>WL-TX-SqlServer-DataSource</data-source-name> 
        <table-map> 
            <table-name>localuser</table-name> 
            <field-map> 
                <cmp-field>email</cmp-field> 
                <dbms-column>EMAIL</dbms-column> 
            </field-map> 
            <field-map> 
                <cmp-field>pw</cmp-field> 
                <dbms-column>PW</dbms-column> 
            </field-map> 
        </table-map> 
</weblogic-rdbms-bean> 
   <weblogic-rdbms-bean> 
<ejb-name>UserInfo</ejb-name>        <data-source-name>WL-TX-SqlServer-DataSource</data-source-name> 
        <table-map> 
            <table-name>userinfo</table-name> 
            <field-map> 
                <cmp-field>email</cmp-field> 
                <dbms-column>EMAIL</dbms-column> 
            </field-map> 
            <field-map> 
                <cmp-field>dept</cmp-field> 
                <dbms-column>DEPT</dbms-column> 
            </field-map> 
            <field-map> 
                <cmp-field>name</cmp-field> 
                <dbms-column>uname</dbms-column> 
            </field-map> 
        </table-map> 
    </weblogic-rdbms-bean> 
  
    <weblogic-rdbms-relation> 
        <relation-name>userInfo-localUser</relation-name> 
        <weblogic-relationship-role> 
            <relationship-role-name>LocalUserRelationshipRole</relationship-role-name> 
            <relationship-role-map> 
                <foreign-key-table>localuser</foreign-key-table> 
                <primary-key-table>userinfo</primary-key-table> 
                <column-map> 
                    <foreign-key-column>EMAIL</foreign-key-column> 
                    <key-column>EMAIL</key-column> 
                </column-map> 
            </relationship-role-map> 
        </weblogic-relationship-role> 
</weblogic-rdbms-relation> 
  
LocalUserBean中的方法: 
ejbCreate(String email,String pw,UserInfoValueObject user){ 
   setEmail(email); 
      setPw(pw) 
} 
  
ejbPostCreate(String email,String pw,UserInfoValueObject user){ 
      Context ctx=new InitialContext(); 
LocalRoleHome home=(LocalRoleHome)ctx.lookup(“LocalRole”); 
home.create(user.getEmail,…………); 
} 
通过ejbPostCreate的方法,调用LocalRoleBean的本地接口,同时创建用户信息,UserInfoValueObject为自己定义的一个用户信息类,记住,这个类一定要实现java.io. Serializable,因为EJB中要求对象都可以序列化。 
  
UserManage中的方法 
添家用户。添加LocalUser的同时,也添加了UserInfo 
       public void addUser(String email, String pw, UserInfoValueObject user) { 
    try{ 
      LocalUser user=userHome.create(email, pw,user); 
      }catch(CreateException ce){ 
      throw new EJBException("创建用户"+email+"错误!",ce); 
} 
} 
  
删除用户。删除LocalUser的同时,也删除了UserInfo 
public void removeUser(String email){ 
try{ 
      userHome.remove(email); 
          }catch(CreateException ce){ 
      throw new EJBException("删除用户"+email+"错误!",ce); 
} 
  } 
  
校验用户密码 
public boolean verifyUser(String email, String pw) { 
    try{ 
      LocalUser user = userHome.findByPrimaryKey(email); 
      return user.getPw().equals(pw); 
    }catch(FinderException fe){ 
      throw new EJBException("校验用户"+email+"错误!",fe); 
    } 
  } 
  
LocalUser----LocalRole的关系为many2many的双相关系。 
     在开始编写EJB CMP的时候,由于我对many2many的关系映射总是失败,所以在项目当中我都避免出现many2many的关系,后来发现EJB中的关系其实就是实现了数据库中的关系,所以对数据库的基础要了解的话,实现起来也不复杂。 
LocalRoleBean: (CMP) 
  public abstract void setRolename(java.lang.String rolename); 
  public abstract void setDescription(java.lang.String description); 
  public abstract java.lang.String getRolename(); 
  public abstract java.lang.String getDescription(); 
  
(CMR) 
  public abstract java.util.Collection getLocalUser(); 
  public abstract void setLocalUser(java.util.Collection localUser); 
  
在LocalUserBean中加,因为是many2many的关系,所以是Collection接口; 
  public abstract void setRoletab(java.util.Collection roletab); 
  public abstract java.util.Collection getRoletab(); 
  
Weblogic-cmp-rdbms-jar.xml 
   <weblogic-rdbms-bean> 
        <ejb-name>Roletab</ejb-name> 
        <data-source-name>WL-TX-SqlServer-DataSource</data-source-name> 
        <table-map> 
            <table-name>roletab</table-name> 
            <field-map> 
                <cmp-field>rolename</cmp-field> 
                <dbms-column>ROLENAME</dbms-column> 
            </field-map> 
            <field-map> 
                <cmp-field>description</cmp-field> 
                <dbms-column>DESCRIPTION</dbms-column> 
            </field-map> 
        </table-map> 
</weblogic-rdbms-bean> 
  
   <weblogic-rdbms-relation> 
        <relation-name>localUser-roletab</relation-name> 
        <table-name>middletab</table-name> 
        <weblogic-relationship-role> 
            <relationship-role-name>LocalUserRelationshipRole</relationship-role-name> 
            <relationship-role-map> 
                <foreign-key-table>middletab</foreign-key-table> 
                <primary-key-table>localuser</primary-key-table> 
                <column-map> 
                    <foreign-key-column>localuserid</foreign-key-column> 
                    <key-column>EMAIL</key-column> 
                </column-map> 
            </relationship-role-map> 
        </weblogic-relationship-role> 
        <weblogic-relationship-role> 
            <relationship-role-name>RoletabRelationshipRole</relationship-role-name> 
            <relationship-role-map> 
                <foreign-key-table>middletab</foreign-key-table> 
                <primary-key-table>roletab</primary-key-table> 
                <column-map> 
                    <foreign-key-column>roleid</foreign-key-column> 
                    <key-column>ROLENAME</key-column> 
                </column-map> 
            </relationship-role-map> 
        </weblogic-relationship-role> 
    </weblogic-rdbms-relation> 
  
UserManage中实现的方法(略); 
  
UserGroup----LocalUser是one2many的双相关系; 
  (CMP) 
  public abstract void setName(java.lang.String name); 
  public abstract void setDescription(java.lang.String description); 
  public abstract java.lang.String getName(); 
  public abstract java.lang.String getDescription(); 
  
  (CMR) 
  public abstract java.util.Collection getLocalUser(); 
  public abstract void setLocalUser(java.util.Collection localUser); 
  
Weblogic-cmp-rdbms-jar.xml 
    <weblogic-rdbms-bean> 
        <ejb-name>LocalGroup</ejb-name> 
        <data-source-name>WL-TX-SqlServer-DataSource</data-source-name> 
        <table-map> 
            <table-name>localgroup</table-name> 
            <field-map> 
                <cmp-field>name</cmp-field> 
                <dbms-column>name</dbms-column> 
            </field-map> 
            <field-map> 
                <cmp-field>description</cmp-field> 
                <dbms-column>description</dbms-column> 
            </field-map> 
        </table-map> 
</weblogic-rdbms-bean> 
  
    <weblogic-rdbms-relation> 
        <relation-name>localUser-localGroup</relation-name> 
        <weblogic-relationship-role> 
            <relationship-role-name>LocalUserRelationshipRole</relationship-role-name> 
            <relationship-role-map> 
                <foreign-key-table>localuser</foreign-key-table> 
                <primary-key-table>localgroup</primary-key-table> 
                <column-map> 
                    <foreign-key-column>LOCAL_GROUP</foreign-key-column> 
                    <key-column>name</key-column> 
                </column-map> 
            </relationship-role-map> 
        </weblogic-relationship-role> 
    </weblogic-rdbms-relation> 
  
总结:首先要对EJB CMP/CMR的实现原理充分了解,其次要了解数据库原理中关系是如何定义的,这样对于你实现关系的映射非常有好处,第三,就是要看别人的代码和例子,多看相关的介绍文章,多做例子。 
由于本人的知识和水平有限,还请大家不吝指教和批评。 
我的联系方式:[email protected](msn) 
希望能和大家共同探讨和学习  
 
  |