转载:JBPM4.4中嵌入自己的用户体系
JBPM4.4中嵌入自己的用户体系2011-03-11 09:17 littie1987 JavaEye博客?T?|?T
很多时候,JBPM自己提供的用户系统是不够用的,这时候就要求我们自己去扩展自己的用户体系。JBPM允许外挂一个用户体系。
AD:
?
很多时候,JBPM自己提供的用户系统是不够用的,这时候就要求我们自己去扩展自己的用户体系。JBPM允许外挂一个用户体系。
如果想嵌入自己的用户体系,只需如下几步:
一:创建MyUserImpl,MyGroupImpl,MyMembershipImpl三个类,分别实现接口User,Group。由于类MyMembershipImpl是独立的,因此没有必要继承或实现其他接口。
MyUserImpl 的主要代码:
Java代码
?
?
- public?class?MyUserImpl?implements?Serializable,?User?{??? ?
- ?? ?
- ????private?static?final?long?serialVersionUID?=?1L;??? ?
- ????private?long?dbid;??? ?
- ????private?String?id;??? ?
- ????private?String?username;//用户名??? ?
- ????private?String?password;//密码??? ?
- ????private?String?sex;//性别??? ?
- ????private?int?age;//年龄??? ?
- ????private?String?tel;//电话号码??? ?
- ??????????? ?
- ????public?String?getUsername()?{??? ?
- ????????return?username;??? ?
- ????}??? ?
- ????public?long?getDbid()?{??? ?
- ????????return?dbid;??? ?
- ????}??? ?
- ????????????????.??? ?
- ????????????????.//省略部分setter和getter方法??? ?
- ????????????????.??? ?
- ????public?String?getId()?{??? ?
- ????????return?this.id;??? ?
- ????}??? ?
- ?? ?
- }?? ?
?
MyGroupImpl 的主要代码:
Java代码
?
?
- public?class?MyGroupImpl?implements?Serializable,?Group?{??? ?
- ?? ?
- ????private?static?final?long?serialVersionUID?=?1L;??? ?
- ??????? ?
- ????private?long?dbid;??? ?
- ????private?String?groupName;??? ?
- ????private?String?groupType;??? ?
- ????private?MyGroupImpl?parentGroup;??? ?
- ??????? ?
- ????public?long?getDbid()?{??? ?
- ????????return?dbid;??? ?
- ????}??? ?
- ????public?void?setDbid(long?dbid)?{??? ?
- ????????this.dbid?=?dbid;??? ?
- ????}??? ?
- ?? ?
- ????????????????//省略部分gettrer和setter方法??? ?
- ?? ?
- ????public?String?getType()?{??? ?
- ????????return?null;??? ?
- ????}??? ?
- ?? ?
- }?? ?
?
MyMembershipImpl 的主要代码:
Java代码
?
?
- public?class?MyMembershipImpl?implements?Serializable?{??? ?
- ?? ?
- ????private?static?final?long?serialVersionUID?=?1L;??? ?
- ??????? ?
- ????protected?long?dbid;??? ?
- ????protected?User?user;??? ?
- ????????????????protected?Group?group;??? ?
- ????????????????protected?String?role;??? ?
- ?????? ?
- ????public?User?getUser()?{??? ?
- ????????return?user;??? ?
- ????}??? ?
- ????public?void?setUser(User?user)?{??? ?
- ????????this.user?=?user;??? ?
- ????}??? ?
- ????public?Group?getGroup()?{??? ?
- ????????return?group;??? ?
- ????}??? ?
- ????public?void?setGroup(Group?group)?{??? ?
- ????????this.group?=?group;??? ?
- ????}??? ?
- ????public?String?getRole()?{??? ?
- ????????return?role;??? ?
- ????}??? ?
- ????public?void?setRole(String?role)?{??? ?
- ????????this.role?=?role;??? ?
- ????}??? ?
- ????public?long?getDbid()?{??? ?
- ????????return?dbid;??? ?
- ????}??? ?
- ????public?void?setDbid(long?dbid)?{??? ?
- ????????this.dbid?=?dbid;??? ?
- ????}??? ?
- }?? ?
?
当然,上面三个类里面的字段可能不满足实际需求,但是没有关系,我们可以添加新的字段。
二:第一步完成了,那么就开始第二步。第二步的主要任务就是将这些类映射到数据库里。由于JBPM的持久层的操作采用的是Hibernate进行的。所以我们必须编写一个Hibernate的映射文件将实体类映射到数据库。这个映射文件可以写在任何位置,但一般建议写到ClassPath路径下面。具体的代码如下:
XML代码
?
- xml?version="1.0"?>??? ?
- >??? ?
- <hibernate-mapping>??? ?
- ????<class?name="en.estar.jbpm.identify.MyUserImpl"?table="JBPM4_MyUser">??? ?
- ????????<id?name="dbid"?column="id">??? ?
- ????????????<generator?class="assigned"?/>??? ?
- ????????id>??? ?
- ????????<property?name="id"?column="userId">property>??? ?
- ????????<property?name="username">property>??? ?
- ????????<property?name="password">property>??? ?
- ????????<property?name="age">property>??? ?
- ????????<property?name="sex">property>??? ?
- ????????<property?name="tel">property>??? ?
- ????class>??? ?
- ??????? ?
- ????<class?name="en.estar.jbpm.identify.MyGroupImpl"?table="JBPM4_MyGroup">??? ?
- ????????<id?name="dbid"?column="id">??? ?
- ?????????????<generator?class="assigned"?/>??? ?
- ????????id>??? ?
- ????????<property?name="groupName">property>??? ?
- ????????<property?name="groupType">property>??? ?
- ????????<many-to-one?name="parentGroup"?? ?
- ?????????????????column="parent"???? ?
- ?????????????????class="en.estar.jbpm.identify.MyGroupImpl"?? ?
- ?????????????????foreign-key="FK_GROUP_PARENT"/>??? ?
- ????class>??? ?
- ??????? ?
- ??????? ?
- ????<class?name="en.estar.jbpm.identify.MyMembershipImpl"?table="JBPM4_MyMembership">??? ?
- ????????<id?name="dbid"?column="id">??? ?
- ??????????<generator?class="assigned"/>??? ?
- ????????id>??? ?
- ????????<many-to-one?name="user"?? ?
- ?????????????????????column="USER_"???? ?
- ?????????????????????class="en.estar.jbpm.identify.MyUserImpl"?? ?
- ?????????????????????foreign-key="FK_MEM_USER"/>??? ?
- ??????? ?
- ????????<many-to-one?name="group"?? ?
- ?????????????????????column="GROUP_"???? ?
- ?????????????????????class="en.estar.jbpm.identify.MyGroupImpl"?? ?
- ?????????????????????foreign-key="FK_MEM_GROUP"/>??? ?
- ??????? ?
- ????????<property?name="role"?column="name"?/>??? ?
- ??class>??? ?
- hibernate-mapping>?? ?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
上面的代码是仿照JBPM默认的映射文件jbpm.identity.hbm.xml写的。这个文件可以在JBPM的源代码里面找到,导入jar包时,它被封装在jbpm.jar里面。映射文件配置好了之后,只需在hibernate的配置文件jbpm.hibernate.cfg.xml中加上一句话就行了。当然,resource的路径根据实际情况而定。
三:通过以上两步,就完成了由实体类到数据库的映射,也就是说,当你启动tomcat运行JBPM的时候,数据库里就会多出三张表:JBPM4_MyUser,JBPM4_MyGroup,JBPM4_MyMembership。虽然如此,但是这只是利用了hibernate的自动生成数据表的功能产生了三个表而已,JBPM凭什么知道我需要使用的是我新创建的这三张表,而不会去调用原来的那三张表呢?答案是,他不知道。
所以我们要继续进行配置。找到jbpm的一个配置文件叫:jbpm.cfg.xml。在这个文件里面原来有一句话:
import resource="jbpm.identity.cfg.xml"。我们可以去查看jbpm.identity.cfg.xml 的实际内容,结果里面就一句话:?。有了这句话,就相当于告诉了JBPM,它将会去调用JBPM自带的关于用户体系操作的一个接口IdentitySession。这个类的实现IdentitySessionImpl里就会默认去调用JBPM自带的用户关系管理的数据表。所以为了改变JBPM的这种习惯,我们就必须自己创建一个类,并实现接口IdentitySession。这样JBPM就会去调用我们自己的实现,而不会再去调用它自己的东东。要实现这个只需要把他的配置文件jbpm.identity.cfg.xml 的import resource="jbpm.identity.cfg.xml“注释掉,然后加上一句:
XML代码
?
- <transaction-context>??? ?
- ???????<hibernate-session?current="true"/>??? ?
- ??????<object??class="en.estar.jbpm.identify.MesIdentitySessionImpl">??? ?
- ????????object>??? ?
- transaction-context>?? ?
?
?
?
这样就OK了。下面的任务就是去实现MesIdentitySessionImpl中的方法了。不过我认为,里边的方法没有必要全部实现,把几个find开头的方法实现了就行了,其他的诸如,创建用户,创建组,删除用户等等之类的,我们就没有必要实现了,必要的时候我们可以自己单独写方法实现,就不需要放到该类当中了。
?
转载:http://developer.51cto.com/art/201103/248633.htm
