Hibernate中多对多关系转换

来源:互联网 发布:网络空间主权 编辑:程序博客网 时间:2024/06/06 06:58
  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配置文件的方式比运用注解方式更加条理清楚

0 0
原创粉丝点击