hibernate笔记--单(双)向的多对多映射关系

简介:   在讲单向的多对多的映射关系的案例时,我们假设我们有两张表,一张角色表Role,一张权限表Function,我们知道一个角色或者说一个用户,可能有多个操作权限,而一种操作权限同时被多个用户所拥有,假如我们我们的需求是能通过角色获取到其所拥有的操作权限,这就构成了单项的多对多的映射关系,为了管理这个...

  在讲单向的多对多的映射关系的案例时,我们假设我们有两张表,一张角色表Role,一张权限表Function,我们知道一个角色或者说一个用户,可能有多个操作权限,而一种操作权限同时被多个用户所拥有,假如我们我们的需求是能通过角色获取到其所拥有的操作权限,这就构成了单项的多对多的映射关系,为了管理这个关系,已经不能再通过添加外键列,必须在建立一张关系表,专门负责角色和权限之间的关系映射,如下:

  这里假设有两个用户一个是管理员admin,一个是普通用户user,管理员拥有全部四个权限,而普通用户只拥有用户管理和资料管理的权限,这种关系在hibernate中应该这样配置:

  新建Function实体类:

public class Function {

    private int id;
    private String name;
        //get/set方法省略
}

  新建Role实体类:

public class Role {

    private int id;
    private String name;
    private Set<Function> sets=new HashSet<Function>();
    //get/set方法省略
}    

在当前包下新建Function类的映射文件Function.hbm.xml:

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC 
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">

<hibernate-mapping package="com.wang.pojo">
    <class name="Function" >
    <id    name="id">
        <generator class="native"></generator>
    </id>
    
    <property name="name"></property>
    </class>
</hibernate-mapping>

在当前包下新建Role类的映射文件Role.hbm.xml:

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC 
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">

<hibernate-mapping package="com.wang.pojo">
    <class name="Role" >
    <id    name="id">
        <generator class="native"></generator>
    </id>
    
    <property name="name"></property>
    <!-- 单向多对多 -->
    <set name="sets" table="role_func" cascade="save-update">
    <!-- 表示当前类映射到关系表中的列 -->
        <key column="roleId"></key>
        <!-- 所对应的另一方在关系表中的列 -->
        <many-to-many column="funcId" class="Function"></many-to-many>
    </set>
    </class>
</hibernate-mapping>

将两个映射文件添加到hibernate.cfg.xml中. 新建一个测试类.测试1:自动生成表2:保存数据3:读取数据:

@Test
    public void testCreateDB() {
        Configuration cfg = new Configuration().configure();
        SchemaExport se = new SchemaExport(cfg);
        // 第一个参数是否生成ddl脚本 第二个参数是否执行到数据库
        se.create(true, true);
    }

    @Test
    public void testSave() {
        Session session = HibernateUtil.getSession();
        Transaction tx = session.beginTransaction();
        Function f1=new Function();
        f1.setName("用户管理");
        Function f2=new Function();
        f2.setName("资料管理");
        Function f3=new Function();
        f3.setName("系统管理");
        Function f4=new Function();
        f4.setName("权限管理");
        
        Role r1=new Role();
        r1.setName("admin");
        r1.getSets().add(f1);
        r1.getSets().add(f2);
        r1.getSets().add(f3);
        r1.getSets().add(f4);
        Role r2=new Role();
        r2.setName("user");
        r2.getSets().add(f1);
        r2.getSets().add(f2);
        session.save(r1);
        session.save(r2);
        tx.commit();
        session.close();
    }
    
    @Test
    public void testGet() {
        Session session = HibernateUtil.getSession();
        Transaction tx = session.beginTransaction();
        Role r=(Role)session.get(Role.class, 1);
        System.out.println("用户:"+r.getName());
        Iterator<Function> it = r.getSets().iterator();
        while(it.hasNext()){
            System.out.print("  "+it.next().getName());
        }
        tx.commit();
        session.close();
    }

以上是单向多对多映射关系的代码,如果我们既需要通过查询Role得到Function中的数据,又需要通过查询Fucntion来得到Role中数据,这样就构成了双向的多对多的映射关系,在上面的基础上需要做如下修改:

  1.在Function实体类中添加  private Set<Role> roles=new HashSet<Role>(); 以及对应get/set方法.

  2.在Function.hbm.xml中,添加以下代码:

<!-- 单向多对多   设置由另一方来维护关系-->
    <set name="roles" table="role_func" inverse="true" cascade="save-update">
    <!-- 表示当前类映射到关系表中的列 -->
        <key column="funcId"></key>
        <!-- 所对应的另一方在关系表中的列 -->
        <many-to-many column="roleId" class="Role"></many-to-many>
    </set>

,这样就可以实现从任何一方读取数据都能读到对应的另一方的数据信息了.

 

相关文章
|
3月前
|
Java 数据库连接 API
解锁高效开发秘籍:深入探究 Hibernate 如何优雅处理一对多与多对多关系,让数据映射再无烦恼!
【9月更文挑战第3天】Hibernate 是 Java 领域中最流行的 ORM 框架之一,广泛用于处理实体对象与数据库表之间的映射。尤其在处理复杂关系如一对多和多对多时,Hibernate 提供了丰富的 API 和配置选项。本文通过具体代码示例,展示如何使用 `@OneToMany`、`@JoinColumn`、`@ManyToMany` 和 `@JoinTable` 等注解优雅地实现这些关系,帮助开发者保持代码简洁的同时确保数据一致性。
66 4
|
4月前
|
Java 数据库连接 数据库
AI 时代风起云涌,Hibernate 实体映射引领数据库高效之路,最佳实践与陷阱全解析!
【8月更文挑战第31天】Hibernate 是一款强大的 Java 持久化框架,可将 Java 对象映射到关系数据库表中。本文通过代码示例详细介绍了 Hibernate 实体映射的最佳实践,包括合理使用关联映射(如 `@OneToMany` 和 `@ManyToOne`)以及正确处理继承关系(如单表继承)。此外,还探讨了常见陷阱,例如循环依赖可能导致的无限递归问题,并提供了使用 `@JsonIgnore` 等注解来避免此类问题的方法。通过遵循这些最佳实践,可以显著提升开发效率和数据库操作性能。
93 0
|
4月前
|
数据库 开发者 Java
Hibernate映射注解的魔力:实体类配置的革命,让你的代码量瞬间蒸发!
【8月更文挑战第31天】Hibernate 是一款出色的对象关系映射框架,简化了 Java 应用与数据库的交互。其映射注解让实体类配置变得直观简洁。本文深入剖析核心概念与使用技巧,通过示例展示如何简化配置。
57 0
|
7月前
|
Java 数据库连接 数据库
hibernate多对多、正向工程创建数据表——访问温馨提示
hibernate多对多、正向工程创建数据表——访问温馨提示
|
7月前
|
Java 数据库连接 数据库
Hibernate5中实体映射命名策略
Hibernate5中实体映射命名策略
146 0
|
7月前
|
SQL 存储 Java
Hibernate - 继承关联关系映射
Hibernate - 继承关联关系映射
75 0
|
7月前
|
机器学习/深度学习 SQL Java
Hibernate - 多对多关联关系映射
Hibernate - 多对多关联关系映射
72 0
|
7月前
|
SQL XML Java
Hibernate - 单向多对一关联关系映射
Hibernate - 单向多对一关联关系映射
42 0
|
7月前
|
SQL Java 关系型数据库
Hibernate - Java 类型, Hibernate 映射类型及 SQL 类型之间的对应关系
Hibernate - Java 类型, Hibernate 映射类型及 SQL 类型之间的对应关系
74 0
|
7月前
|
SQL 缓存 Java
框架分析(9)-Hibernate
框架分析(9)-Hibernate