Shark的用户管理模块是独立于其它模块的,为了方便与其它系统整合,可以把该模块改为Hibernate实现。
Shark中附带的Hibernate实现代码是针对Shark 1.0版本的,在当前的版本(1.1-2)中,数据库的结构和Shark的API都发生了变化,所以要对Hibernate代码和数据库做一些调整。
另外,Shark中附带的Hibernate实现代码是Hibernate 2.0的,如果需要,做一些很小的调整就可以升级到Hibernate 3.0。
Hibernate代码的调整完全可以依赖Shark的API说明来做,由于数据库主键都发生了变化,所有查询都需要更改。但是由于Shark的查询方式非常单一,例如对用户表只有一种查询方式,对group表也只有一种查询方式,改动可以很快完成。
Shark用户模块的数据库只有4个表,分别是GroupTable、GroupGroupTable、UserGroupTable、UserTable。Shark数据库的主要修改在于主键发生了变化。由于DODS的需要,每个表都有OID和Version两个列,其中OID是主键。因此,主要问题就集中在这两个字段如何赋值。如果采用的是其它系统的用户表就没有这个问题了。
以下三个文件是Hibernate的配置文件:
hibernate.user.cfg.xml
HibernateUser.hbm.xml
HibernateGroup.hbm.xml
放置在{classes}/hbm/UserGroup/目录下,
org.enhydra.shark.usertransaction.ThreadLocalSession文件中需要指出配置文件的路径:
static {
try {
sessionFactory = new Configuration().configure(
"/hbm/UserGroup/hibernate.user.cfg.xml").buildSessionFactory();
} catch (HibernateException ex) {
throw new RootError("Exception building SessionFactory: "
+ ex.getMessage(), ex);
}
}
shark.conf需要做如下调整:
首先,更换AuthenticationManager接口的实现类,选用HibernateAuthenticationManager
#AuthenticationManagerClassName=org.enhydra.shark.authentication.LDAPAuthenticationManager
#AuthenticationManagerClassName=org.enhydra.shark.authentication.DODSAuthenticationManager
AuthenticationManagerClassName=org.enhydra.shark.authentication.HibernateAuthenticationManager
其次,更换UserGroupManager接口的实现类,选用HibernateUserGroupManager
#UserGroupManagerClassName=org.enhydra.shark.usergroup.LDAPUserGroupManager
#UserGroupManagerClassName=org.enhydra.shark.usergroup.DODSUserGroupManager
UserGroupManagerClassName=org.enhydra.shark.usergroup.HibernateUserGroupManager
第三,更换UserTransactionManager接口的实现类,选择HibernateUserTransactionFactory
#UserTransactionManagerClassName=org.enhydra.shark.usertransaction.DODSUserTransactionFactory
UserTransactionManagerClassName=org.enhydra.shark.usertransaction.HibernateUserTransactionFactory
总之,用户管理模块改为Hibrnate实现的工作量不大。