NetBpm 数据库(9)
原文:http://blog.csdn.net/adicovofer/article/details/1718592
关注NetBpm也很久了,可是一直没有静下心来研究,为了生活的琐事,太过浮躁……今天闲来无事,关注了一下NetBpm的组织结构,小记于此。
在NetBpm中,集成了组织结构,在数据库中体现在表NBPM_ACTOR和表NBPM_MEMBERSHIP上。NBPM_ACTOR存储了参与者的所有信息,包括User和Group,以及Group之间的关系(主要是Parent),NBPM_MEMBERSHIP保存了参与者的关系。
先看看实体之间的关系以及源码的组织结构
User,Group继承了Actor,与Membership是一对多的关系。
ActorImpl,GroupImpl,UserImpl分别是Atcor,Group,User的实体,与数据库的对应关系定义在配置文件ActorImpl.hbm.xml。MembershipImpl是Membership的实体,与数据库的对应关系定义在文件MembershipImpl.hbm.xml中。
NBPM_ACTOR的设计表如图:
ID:Actor的主码
SUBCLASS:这个是比较关键的字段,通过区分它,把这个表映射到相应的实体,即ActopImpl,UserImpl,GroupImpl。如果SUBCLASS等于User,NetBpm就将这条记录映射到UserImpl,作为User对待;如果SUBCLASS等于Group,NetBpm就将这条记录映射到GroupImpl,作为Group对待;如果SUBCLASS等于Actor,就映射到ActorImpl,ActorImpl是UserImpl和GroupImpl的基类,当然Actor也就包含了所有的UserImpl和GroupImpl。这里的映射是通过Nhibernate的配置文件来完成的,大家可以注意这个选项 discriminator-value。
NAME:Actor的名称,当前行为Group时有效,即Group的名称
TYPE_:Actor的类型,当前行为Group是有效,即Group的类型。
Parent:当前记录的父节点,只有当前记录为Group时有效
FIRSTNAME:
LASTNAME:
EMAIL:
现在应该明白了吧,其实这里分为两个表更加容易理解
User表 |
GROUP表 |
ID |
ID |
FIRSTNAME |
NAME |
LASTNAME |
TYPE_ |
|
|
NBPM_MEMEBERSHIP设计表如下:
ID:主码而已
ROLE:
TYPE_:Membership类型,几乎没有使用,我只在Test代码中看到过。
GROUP_:外码,Group的ID(NBPM_ACTOR.ID)
USER_:外码,User的ID(NBPM_ACTOR.ID)
NBPM_MEMEBERSHIP 表明了 User隶属于某个Group和 User的Role。其实也可以分为两个表来看:
User-Role对应表 |
User-Group对应表 |
ID |
ID |
Role |
USER_ |
USER_ |
GROUP_ |
现在的结构应该很清楚了。
更正:
NBPM_MEMEBERSHIP中的TYPE_是有用的,在源码中可以看到。NBPM_MEMEBERSHIP实际应该看成:
User-Role对应表
|
User-Group对应表
|
ID
|
ID
|
Role
|
USER_
|
USER_
|
GROUP_
|
|
TYPE_
|
TYPE_的参考源码,注意membership-type
{
/// <summary> allows to specify the next-actor in a process definition as an expression using the following syntax.
/// <p>The general syntax is firstArgument->nextArgument->nextArgument->...->nextArgument
/// </p>
/// <p>For the firstArgument, following constructions are valid :
/// <ul>
/// <li><b>previousActor</b> : </li>
/// <li><b>actor( <actorName> )</b> : </li>
/// <li><b>user( <userName> )</b> : </li>
/// <li><b>group( <groupName> )</b> : </li>
/// </ul>
/// </p>
/// <p>For the nextArgument's, following constructions are valid :
/// <ul>
/// <li><b>[User]->group( <membership-type> )</b> results in a Group</li>
/// <li><b>[Group]->role( <role> )</b> results in a User</li>
/// <li><b>[Group]->parentGroup</b> results in a Group</li>
/// </ul>
/// </p>
/// </summary>
public class AssignmentExpressionResolver : IAssignmentHandler
{
/// <summary> resolves an expression to a user or a group using the following syntax :
/// <p>The general syntax is firstArgument->nextArgument->nextArgument->...->nextArgument
/// </p>
/// <p>For the firstArgument, following constructions are valid :
/// <ul>
/// <li><b>previousActor</b> : </li>
/// <li><b>processInitiator</b> : </li>
/// <li><b>actor( <actorName> )</b> : </li>
/// <li><b>role( <attributeName> )</b> : </li>
/// <li><b>user( <userName> )</b> : </li>
/// <li><b>group( <groupName> )</b> : </li>
/// </ul>
/// </p>
/// <p>For the nextArgument's, following constructions are valid :
/// <ul>
/// <li><b>[User]->group( <membership-type> )</b> results in a Group</li>
/// <li><b>[Group]->role( <role> )</b> results in a User</li>
/// <li><b>[Group]->parentGroup</b> results in a Group</li>
/// </ul>
/// </p>
/// </summary>
public class ActorExpressionResolver