Hibernate中多对多关系转换

  1. 问题来源

    在运用SSH架构开发Web应用时,总会遇到表之间一对多、多对一、多对多等等的关系,而对于多对多的关系,在操作和性能方面都不太理想,所以多对多的映射使用较少,实际使用中最好转换成一对多的对象模型;hibernate会为我们创建中间关联表,转换成两个一对多。

  2. 问题解决

    在此用开发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

Hibernate中多对多关系转换的相关文章

关于hibernate中多对多关系

关于多对多关系 数据库:在使用多对多的关系时,我们可以使用复合主键.也可以不使用,直接引入外键同样可以实现. 在数据库中使用多对多关系时,需要一个中间表. 多对多关系中的数据库结构如下: 表:Orders 字段:orderid(主键)..... 表:Users 字段:usersid(主键),.... 中间表: cy_order_user 字段:cy_order_user主键id 外键:cy_orderid(引入Orders表) 外键:cy_usersid(引入Users表) 注意:中间表的外键是

hibernate中多对多关联

hibernate中多对多关联 “计应134(实验班) 凌豪” 在关系数据库中有一种常见的关系即多对多关系,例如课程和学生的关系,一个学生可以选择多门课程,同时一门课程也可以被多个学生选择, 因此课程与学生的关系就可以看成是多对多的关系,其中课程表的结构如下图所示: 学生表user 在关系数据库中不能直接建立多对多关联,要想建立这种多对多的关系只能借助第三张中间表, 因此为了建立这种多对多的关系我们需要建立第三张表User_course 为了实现表的多对多关联,需要在两个表的Hibernate配

hibernate中的继承关系

  1.       hibernate中的继承关系   代码:   <1>.POJO类:(Person类)   package qau.edu; import java.util.Date; public class Person { //  成员变量: private int id ; private String name ; private Date date ; //  相应的getter和setter方法: public int getId() { return id; } pub

Hibernate中的映射关系(一对多)

在数据库中表和表之间的关系有几种,下面就详细说一下在Hibernate中怎样映射一对多的关系 Hibernate映射一对多的关系,其实就是持久类之间的映射,那如何把持久类关联起来呢??那就用到.hbm.xml文件的<many-to-one>标签了 具体做法如下: 新建一个customer类: package com.jeremy.hibernate.app.example; public class Customer { private Integer customerId; private

关联映射 ---- Hibernate之多对多关系

叙:上一章详细的记录了关联映射中的"一对多|多对一"关系.级联操作.关系的维护等知识点,本章节轻风学习记录的是级联关系中的"多对多"关系: Hibernate的"多对多"级联关系 1. 介绍 在生活中很多关系都是多对多的,比如一个人在公司是技术部的同时也是营销部的(只是个例子),所以,多对对关系是很普遍的,一个对象有多个角色,而一个角色又可以有多个对象,因此最正确的做法是在对象与角色之间创建一个新的表,用来保存对象和角色的主键,方便调用查看相应的

数据库中多对多关系及其实现

事物A中的一条记录可以对应事物B中的多条记录,而事物B中的一条记录也可以对应事物A中的多条记录.例如:学校中,一个班级可以有多名任课老师,而一名老师可以教多个班级.这时,可以引入一个表C来模拟多对多关系. SQL语句: --班级表 create table banji ( banji_id int primary key, banji_num int not null, banji_name nvarchar(100) ) --教师 create table jiaoshi ( jiaoshi_

hibernate中一对多关系模式的设计

hibernate中一对多的关系模式的设计 注解应该交由多的一方维护和管理. 例如:bbs的模块设计 三个表 版块表(category) .主题帖表(topic)和回帖表(msg) 他们之间的对应关系是:一个版块对应多个主题帖,一个主题帖有多个回复贴. 以下是对应的建表语句. CREATE TABLE `category` ( `id` int(11) NOT NULL auto_increment, `name` varchar(255) default NULL, PRIMARY KEY (

XAF中多对多关系 (XPO)

In this lesson, you will learn how to set relationships between business objects. For this purpose, the Task business class will be implemented and a Many-to-Many relationship will be set between the Contact and Task objects. You will also learn the

数据库表中多对多关系怎么设计?

(多对多关系)(视频下载) (全部书籍) 马克-to-win:Teacher表:两列id,name.Studnet表: 三列:id,name,ageTeacherStudent表(关系表):三列:id,tid,sid create table TeacherStudent(id int not null,tid int not null,sid int not null); 2) teacher and student:(一个老师可能有多个学生,一个学生可能有多个老师) qixy有两个学生:li