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配置文件的方式比运用注解方式更加条理清楚

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

DYanchao2015

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值