一 综述
在权限管理系统中,一个常用的系统为 role group ,以及之间的关联表privilede 。并且role 与 group之间是多对多
映射 。本文使用了hibernate3.2 。
二 数据库创建脚本
create table role
(
role_id int primary key ,
role_name varchar(20)
);
create table gr
(
group_id int primary key ,
group_name varchar(20)
) ;
create table privilege
(
role_id int ,
group_id int ,
primary key(role_id , group_id) ,
foreign key (role_id) references role(role_id) ,
foreign key (group_id) references gr(group_id)
) ;
三 映射文件中
1 存在三个 数据库的表,但是只存在两个映射文件, 以及两个vo类 。现在将两个映射文件显示如下:
Role.hbm.xml 如下:
<hibernate-mapping>
<class name="cn.bupt.duming.vo.Role" table="role" catalog="login">
<id name="role_id" type="java.lang.Integer">
<column name="role_id" />
</id>
<property name="role_name" type="java.lang.String">
<column name="role_name" length="20" />
</property>
// 表示在Role的vo类中,存在一个集合类,存储Group实例
//注意 ,此处的表 table应该为两张表之间的关系表
<set name="groups" inverse="true" table="privilege" >
<key>
<column name="role_id" />
</key>
<many-to-many class="cn.bupt.duming.vo.Gr" column="group_id" outer-join ="auto"/>
</set>
</class>
</hibernate-mapping>
2 Gr.hbm.xml 文件实例
<hibernate-mapping>
<class name="cn.bupt.duming.vo.Gr" table="gr" catalog="login">
<id name="group_id" type="java.lang.Integer">
<column name="group_id" />
</id>
<property name="group_name" type="java.lang.String">
<column name="group_name" length="20" />
</property>
//注意 此处的table 应该为两张表之间的关系表
<set name="roles" inverse="false" lazy="false" table="privilege">
<key>
<column name="group_id" />
</key>
<many-to-many class="cn.bupt.duming.vo.Role" column ="role_id" />
</set>
</class>
</hibernate-mapping>
四 实体类 vo类
1 Gr.java
public class Gr implements Serializable {
private int group_id ;
private String group_name ;
private Set <Role> roles = new HashSet<Role>() ;
}
2 Role.java
public class Role implements Serializable {
private int role_id ;
private String role_name ;
private Set<Gr> groups = new HashSet<Gr>();
}
以上vo类省略了 set 和get 方法。
五 测试类
Role role1 = new Role() ;
role1.setRole_id(1) ;
role1.setRole_name("duming1") ;
Role role2 = new Role() ;
role2.setRole_id(2) ;
role2.setRole_name("duming2") ;
Role role3 = new Role() ;
role3.setRole_id(3) ;
role3.setRole_name("duming3") ;
Gr group1 = new Gr() ;
group1.setGroup_id(1) ;
group1.setGroup_name("group1") ;
Gr group2 = new Gr() ;
group2.setGroup_id(2) ;
group2.setGroup_name("group2") ;
Gr group3 = new Gr() ;
group3.setGroup_id(3) ;
group3.setGroup_name("group3") ;
group1.getRoles().add(role1) ;
group1.getRoles().add(role2) ;
group2.getRoles().add(role2) ;
group2.getRoles().add(role3) ;
group3.getRoles().add(role1) ;
group3.getRoles().add(role3) ;
role1.getGroups().add(group1) ;
role1.getGroups().add(group2) ;
role2.getGroups().add(group2) ;
role2.getGroups().add(group3) ;
role3.getGroups().add(group1) ;
role3.getGroups().add(group3) ;
Transaction tc = session.beginTransaction() ;
session.save(group1) ;
session.save(group2) ;
session.save(group3) ;
session.save(role1) ;
session.save(role2) ;
session.save(role3) ;
六 输出的sql 语句
Hibernate:
insert
into
login.gr
(group_name, group_id)
values
(?, ?)
Hibernate:
insert
into
login.gr
(group_name, group_id)
values
(?, ?)
Hibernate:
insert
into
login.gr
(group_name, group_id)
values
(?, ?)
Hibernate:
insert
into
login.role
(role_name, role_id)
values
(?, ?)
Hibernate:
insert
into
login.role
(role_name, role_id)
values
(?, ?)
Hibernate:
insert
into
login.role
(role_name, role_id)
values
(?, ?)
Hibernate:
insert
into
privilege
(group_id, role_id)
values
(?, ?)
Hibernate:
insert
into
privilege
(group_id, role_id)
values
(?, ?)
Hibernate:
insert
into
privilege
(group_id, role_id)
values
(?, ?)
Hibernate:
insert
into
privilege
(group_id, role_id)
values
(?, ?)
Hibernate:
insert
into
privilege
(group_id, role_id)
values
(?, ?)
Hibernate:
insert
into
privilege
(group_id, role_id)
values
(?, ?)
七 总结
两个表之间是多对多的关系,但是在数据库中只存在两表,及其两表之间的关系表(共3张表)。而vo类只需要建立两个
实体类 ,关系表的vo类不需要建立。 同样映射文件也只要配置2个,关系表的映射文件也不需要配置。