- 问题来源
在运用SSH架构开发Web应用时,总会遇到表之间一对多、多对一、多对多等等的关系,而对于多对多的关系,在操作和性能方面都不太理想,所以多对多的映射使用较少,实际使用中最好转换成一对多的对象模型;hibernate会为我们创建中间关联表,转换成两个一对多。
- 问题解决
在此用开发OA项目时角色表和权限之间的多对多关系提供解决问题的建议
例子:角色与权限
(1)先看需求
(2)分析
第一,角色与权限:多对多
一个角色可以有多个权限,一个权限可以被多个角色使用
第二,在角色的增删改查中涉及到了权限,因此为双向(区别于第二个例子),在此将多对多的关系进行简易转 换,通过中间表(role_Privilege)的形式保存到数据库中
第三,根据需求来看,权限是固定的,并不是一个单独表,当然也构不成一个单独的实体类,在此设置成Map
public class Constant {
/*----------系统权限管理-----------------------*/
public static String PRIVILEGE_XZGL = "xzgl";
public static String PRIVILEGE_HQFW = "hqfw";
public static String PRIVILEGE_ZXXX = "zxxx";
public static String PRIVILEGE_NSFW = "nsfw";
public static String PRIVILEGE_SPACE = "spaces";
public static Map<String,String> PRIVILEGE_MAP;
static {
PRIVILEGE_MAP = new HashMap<String, String>();
PRIVILEGE_MAP.put(PRIVILEGE_XZGL, "行政管理");
PRIVILEGE_MAP.put(PRIVILEGE_HQFW, "后勤服务");
PRIVILEGE_MAP.put(PRIVILEGE_ZXXX, "在线学习");
PRIVILEGE_MAP.put(PRIVILEGE_NSFW, "纳税服务");
PRIVILEGE_MAP.put(PRIVILEGE_SPACE, "我的空间");
}
(3)问题解决
在role_Privilege表中是联合主键,在此将联合主键通过类的方式进行设置,联合主键要求:实现序列化接口、重写hashCode()和equals方法,设置的原因:在对角色Entity进行增删改查时,需要将Role与联合主键的Role进行equals,至于实现Serializable,则是对Entity方便IO传输
Demo:
Role实体类:
public class Role implements Serializable {
private String roleId;
private Set<RolePrivilege> rolePrivileges;//因为根据需求进行增删改查需要用到权限,双向
............
RolePrivilege类:
public class RolePrivilege implements Serializable {
private RolePrivilegeId id;//联合主键
RolePrivilegeId类:
public class RolePrivilegeId implements Serializable {
//为什么运用Role而不是运用roleId,原因:需求
private Role role;//角色
//private String roleId;//角色
private String code;//权限
配置文件Role.hbm.xml:
<!--
1.将role表和权限表多对多的关系通过中间表的形式转换成一对多
2.将inverse设置为true是指取消单方面维护
3.懒加载:需要时加载,在此设置false
4.设置级联:在进行更新与删除操作时,需要将role_Privilege中对应的数据进行删除,在进行保存
-->
<set name="rolePrivileges" inverse="true" lazy="false" cascade="save-update,delete">
<key>
<column name="role_id"></column>
</key>
<one-to-many class="cn.test.nsfw.role.entity.RolePrivilege"/>
</set>
配置文件RolePrivilege.hbm.xml
<hibernate-mapping>
<class name="cn.test.nsfw.role.entity.RolePrivilege" table="role_Privilege">
<composite-id name="id" class="cn.test.nsfw.role.entity.RolePrivilegeId">
<key-many-to-one name="role" class="cn.test.nsfw.role.entity.Role" lazy="false">
<column name="role_id"></column>
</key-many-to-one>
<key-property name="code" type="java.lang.String">
<column name="code" length="20"></column>
</key-property>
</composite-id>
</class>
</hibernate-mapping>
运行结果:
3. 总结
(1)不要忽视需求的重要性,他是我们开发过程中的指向标 (2)个人感觉运用XML配置文件的方式比运用注解方式更加条理清楚
时间: 2024-10-04 23:58:33