Hibernate中多对多关系转换
来源:互联网 发布:网络空间主权 编辑:程序博客网 时间:2024/06/06 06:58
问题来源
在运用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配置文件的方式比运用注解方式更加条理清楚
0 0
- Hibernate中多对多关系转换
- 关于hibernate中多对多关系
- hibernate中多对多关系映射
- hibernate中多对一关系映射
- hibernate 多对多关系
- Hibernate多对多关系
- hibernate 多对多关系
- hibernate关联关系之多对多关系
- Hibernate关系映射之多对多关系
- Hibernate中多对多关系的常见问题
- Hibernate中多对多关系的常见问题
- Hibernate中多对多关系的常见问题
- Hibernate中多对多关系的常见问题 (摘)
- Hibernate中多对多关系如何查询
- Hibernate中多对多关系的常见问题
- Hibernate中多对多关系映射 、查询
- Hibernate多对多映射关系中自定义排序
- Hibernate中一对多和多对一关系
- tabbar Item图片原色显示以及标题字体大小颜色控制
- js实现跨域(jsonp, iframe+window.name, iframe+window.domain, iframe+window.postMessage)
- Unable to instantiate application com.android.tools.fd.runtime.BootstrapApplication
- 自定义分组 写一个查询
- javascript 面向对象程序设计 (摘自js高级程序设计)
- Hibernate中多对多关系转换
- c++/c static 用法总结
- Unbuta环境下配置Nexus私服仓库
- iOS 使用图片叠加做动画,类似Tom猫
- MFC/基于对话框的MFC上位机串口通信(C++实现)简单例程
- 移动端媒体查询的一些尺寸参考
- 华为2016暑假实习机试题
- 一个女程序员想说的话
- 2016江苏省大学生程序设计大赛 JSCPC 总结