关联是类(类的实例)之间的关系,表示有意义和值得关注的连接。

本系列将介绍Hibernate中主要的几种关联映射

Hibernate一对一主键单向关联
Hibernate一对一主键双向关联
Hibernate一对一外键单向关联
Hibernate一对一外键双向关联
Hibernate多对一单向关联
Hibernate多对一双向关联

Hibernate多对多关联

代码都写有注释,主要包括(核心配置文件,实体映射文件,实体类,测试类,数据库)主要操作有增删改查。

本篇主要介绍Hibernate多对多关联:

hibernate.cfg.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
        "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
        "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
    <session-factory>
      <!-- 配置数据库连接驱动类 -->
        <property name="connection.driver_class">com.mysql.jdbc.Driver</property>
        <!-- 配置数据库连接字符串 -->
        <property name="connection.url"><![CDATA[jdbc:mysql://localhost:3306/test111?useUnicode=true&characterEncoding=utf8]]></property>
        <!-- 配置数据库连接用户名 -->
        <property name="connection.username">root</property>
        <!-- 配置数据库连接密码 -->
        <property name="connection.password">123456</property>
        <!-- 配置数据库方言 -->
        <property name="dialect">org.hibernate.dialect.MySQLDialect</property>
        <!-- 配置数据库表生成策略 -->
        <!--<property name="hibernate.hbm2ddl.auto">update</property> -->
        <!-- 配置是否打印显示SQL语句 -->
        <property name="show_sql">true</property>
        <!-- 配置是否格式化显示SQL语句 -->
        <property name="format_sql">true</property>
        <!-- 配置hibernate是否自动提交事务 -->
        <!--<property name="hibernate.connection.autocommit">true</property> -->

        <!--多对多关联 -->
        <mapping resource="com/great/entity6/User.hbm.xml"></mapping>
        <mapping resource="com/great/entity6/Role.hbm.xml"></mapping>
    </session-factory>
</hibernate-configuration>

User.hbm.xml

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.great.entity6">
    <class name="User" table="user1">
        <id name="id" column="id" type="int">
            <generator class="native">
            </generator>
        </id>

        <property name="name" column="name" type="string"></property>
        <set name="roles" table="mapping1">
            <key column="user_id"></key>
            <many-to-many class="com.great.entity6.Role" column="role_id"></many-to-many>
        </set>
    </class>
</hibernate-mapping>

Role.hbm.xml

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.great.entity6">
    <class name="Role" table="role1">
        <id name="id" column="id" type="int">
            <generator class="native">
            </generator>
        </id>

        <property name="roleName" column="roleName" type="string"></property>
        <set name="users" table="mapping1">
            <key column="role_id"></key>
            <many-to-many class="com.great.entity6.User" column="user_id"></many-to-many>
        </set>
    </class>
</hibernate-mapping>

User.java

package com.great.entity6;

import java.util.Set;

public class User {
    private int id;
    private String name;
    private Set<Role> roles;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Set<Role> getRoles() {
        return roles;
    }

    public void setRoles(Set<Role> roles) {
        this.roles = roles;
    }

}

Role.java

package com.great.entity6;

import java.util.Set;

public class Role {
    private int id;
    private String roleName;
    private Set<User> users;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getRoleName() {
        return roleName;
    }

    public void setRoleName(String roleName) {
        this.roleName = roleName;
    }

    public Set<User> getUsers() {
        return users;
    }

    public void setUsers(Set<User> users) {
        this.users = users;
    }

}

TestManyToMany.java

package com.great.test;

import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.Test;

import com.great.entity6.Role;
import com.great.entity6.User;

public class TestManyToMany {
    static Session session;

    // 多表对多表关联
    @BeforeClass
    public static void setUpBeforeClass() throws Exception {
        // 加载hibernate主配置文件
        Configuration cfg = new Configuration().configure();
        // 构建session工厂
        SessionFactory sf = cfg.buildSessionFactory();
        // 打开session
        session = sf.openSession();
    }

    @AfterClass
    public static void tearDownAfterClass() throws Exception {
        // 关闭session,释放资源
        session.close();
    }

    // select1 ,通过User查询数据
    @Test
    public void testManyToManySelect1() {
        User user = (User) session.get(User.class, 1);
        System.out.println("用户姓名是:" + user.getName());
        System.out.println("用户的权限有:");
        Set<Role> roles = user.getRoles();
        Iterator<Role> it = roles.iterator();
        while (it.hasNext()) {
            System.out.print(it.next().getRoleName() + " ");
        }
    }

    // select2 ,通过Role查询数据
    @Test
    public void testManyToManySelect2() {
        Role role = (Role) session.get(Role.class, 1);
        System.out.println("权限名称为:" + role.getRoleName());
        System.out.println("拥有此权限的人有:");
        Set<User> users = role.getUsers();
        Iterator<User> it = users.iterator();
        while (it.hasNext()) {
            System.out.print(it.next().getName() + " ");
        }
    }

    /*
     * insert1,通过User插入数据 [发出七条语句,insert role1,insert role2,insert user,insert
     * mapping1 2条,role1表中保存2条数据,user1表中保存1条数据,mapping1表中保存2条数据]
     */
    @Test
    public void testManyToManySave1() {
        Transaction ts = session.beginTransaction();
        User user = new User();
        user.setName("王小胖");

        Role role1 = new Role();
        role1.setRoleName("删帖权限1");
        Role role2 = new Role();
        role2.setRoleName("管理员权限2");

        Set<Role> roles = new HashSet<Role>();
        Set<User> user1 = new HashSet<User>();
        Set<User> user2 = new HashSet<User>();
        roles.add(role1);
        roles.add(role2);
        user1.add(user);
        user2.add(user);

        user.setRoles(roles);// 和save2区别的地方

        session.save(role1);
        session.save(role2);
        session.save(user);
        ts.commit();
    }

    /*
     * insert2,通过Role插入数据 [发出七条语句,insert role1,insert role2,insert user,insert
     * mapping1 2条,role1表中保存2条数据,user1表中保存1条数据,mapping1表中保存2条数据]
     */
    @Test
    public void testManyToManySave2() {
        Transaction ts = session.beginTransaction();
        User user = new User();
        user.setName("王6胖");

        Role role1 = new Role();
        role1.setRoleName("删帖权限44");
        Role role2 = new Role();
        role2.setRoleName("管理员权限44");

        Set<Role> roles = new HashSet<Role>();
        Set<User> user1 = new HashSet<User>();
        Set<User> user2 = new HashSet<User>();
        roles.add(role1);
        roles.add(role2);
        user1.add(user);
        user2.add(user);

        role1.setUsers(user1);// 和save1区别的地方
        role2.setUsers(user2);

        session.save(role1);
        session.save(role2);

        ts.commit();
    }

    /*
     * delete1,通过User删除用户数据,通过发出一条select语句,两条delete语句,先delete mapping1,再delete
     * user1。
     */
    @Test
    public void testManyToManyDelete1() {
        Transaction ts = session.beginTransaction();
        User user = (User) session.get(User.class, 8);
        session.delete(user);
        ts.commit();
    }

    /*
     * delete2,通过Role删除权限数据,通过发出一条select语句,两条delete语句,先delete mapping1,再delete
     * role1。
     */
    @Test
    public void testManyToManyDelete2() {
        Transaction ts = session.beginTransaction();
        Role role = (Role) session.get(Role.class, 5);
        session.delete(role);
        ts.commit();
    }

    /* update1,通过User更新用户数据,添加权限, update user1,insert mapping1 */
    @Test
    public void testManyToManyUpdate1() {
        Transaction ts = session.beginTransaction();
        User user = (User) session.get(User.class, 4);
        user.setName("张二");
        // 获得权限
        Role role = (Role) session.get(Role.class, 1);
        Set<Role> roles = user.getRoles();
        roles.add(role);
        user.setRoles(roles);
        session.save(user);
        ts.commit();
    }

    /* update2,通过Role更新权限,添加此权限的拥有者, update role1,insert mapping1 */
    @Test
    public void testManyToManyUpdate2() {
        Transaction ts = session.beginTransaction();
        User user = (User) session.get(User.class, 4);
        // 获得权限
        Role role = (Role) session.get(Role.class, 2);
        role.setRoleName("系统权限");
        Set<User> users = role.getUsers();
        users.add(user);
        role.setUsers(users);
        session.save(role);
        ts.commit();
    }
}

数据库:

user1表

两个字段:id name

mapping1表

三个字段:id user_id role_id

role1表

两个字段: id roleName

注意:在mapping表上建立两个外键关系,user_id和role_id。

hibernate多对多关联映射的更多相关文章

  1. Hibernate多对多关联映射的HQL中的in条件查询问题

    群里有朋友求解一个问题,高分求一条HQL多对多查询语句 . 问题描述见 http://topic.csdn.net/u/20090621/16/4eac6fe0-bf3e-422e-a697-f758 ...

  2. Hibernate 多对多关联映射, 中间表加查询条件

    package com.coracle.yk.xpo.po.base; import java.util.Date; import java.util.HashSet; import java.uti ...

  3. hibernate的多对多关联映射

    在我们实际项目中,多对多的情况也时长存在,比如最常见的就是系统管理的五张表,如下面的一个结构: 在本文学习hibernate多对多关联映射的实验中我简单的写几个字段,达到学习目的即可. 1.多对多的关 ...

  4. 【Hibernate框架】关联映射(一对多,多对一)

    根据我们的总结计划,上篇文章我们总结了有关于一对一映射相关知识,接下来,我们进行下一个阶段,一对多.多对一映射相关知识. 场景设定: 国家规定,一个人只能在一个公司上班,一个公司可以拥有很多员工.我们 ...

  5. (Hibernate进阶)Hibernate映射——多对多关联映射(八)

    多对多映射是现实生活中最常见的映射,也是最容易理解的映射.废话少说,直接开始. 映射原理 不论是单向关联还是双向关联都是通过第三张表,将两个表中的主键放到第三张做一个关联.用第三张表来解决可能会造成数 ...

  6. Hibernate(六)——多对多关联映射

    前面几篇文章已经较讲解了三大种关联映射,多对多映射就非常简单了,不过出于对关联映射完整性的考虑,本文还是会简要介绍下多对多关联映射. 1.单向多对多关联映射 情景:一个用户可以有多个角色,比如数据录入 ...

  7. hibernate之关于使用连接表实现多对一关联映射

    [Hibernate]之关于使用连接表实现多对一关联映射 在我们项目使用中採用中间表最多的一般就是多对一,或者是多对多,当然一对一使用中间表也是能够的,可是这样的几率通常少之又少!所以这里重点介绍多对 ...

  8. 一口一口吃掉Hibernate(六)——多对多关联映射

    今天来说说hibernate中的多对多关联映射,多对多关联映射涉及到单向映射和双向映射2种. 首先举个多对多关联例子:用户User和角色Role,一个用户可以属于多个角色,一个角色可以有多个用户.这就 ...

  9. 【SSH系列】Hibernate映射 -- 多对多关联映射

         映射原理 在数据库学习阶段,我们知道,如果实体和实体之间的关系是多对多,那么我们就抽出来第三张表,第一张表和第二张表的主键作为第三表的联合主键,结合我们的hibernate,多对多关联,无论 ...

随机推荐

  1. UWP中实现自定义标题栏

    UWP中实现自定义标题栏 0x00 起因 在UWP开发中,有时候我们希望实现自定义标题栏,例如在标题栏中加入搜索框.按钮之类的控件.搜了下资料居然在一个日文网站找到了一篇介绍这个主题的文章: http ...

  2. SQL Server 致程序员(容易忽略的错误)

    标签:SQL SERVER/MSSQL/DBA/T-SQL好习惯/数据库/需要注意的地方/程序员/容易犯的错误/遇到的问题 概述 因为每天需要审核程序员发布的SQL语句,所以收集了一些程序员的一些常见 ...

  3. CRL快速开发框架系列教程十一(大数据分库分表解决方案)

    本系列目录 CRL快速开发框架系列教程一(Code First数据表不需再关心) CRL快速开发框架系列教程二(基于Lambda表达式查询) CRL快速开发框架系列教程三(更新数据) CRL快速开发框 ...

  4. 【C#附源码】数据库文档生成工具支持(Excel+Html)

    [2015] 很多时候,我们在生成数据库文档时,使用某些工具,可效果总不理想,不是内容不详细,就是表现效果一般般.很多还是word.html的.看着真是别扭.本人习惯用Excel,所以闲暇时,就简单的 ...

  5. 获取微软原版“Windows 10 推送器(GWX)” 卸载工具

    背景: 随着Windows 10 免费更新的结束,针对之前提供推送通知的工具(以下简称GWX)来说使命已经结束,假设您还未将Windows 8.1 和Windows 7 更新到Windows 10 的 ...

  6. [原] 利用 OVS 建立 VxLAN 虚拟网络实验

    OVS 配置 VxLAN HOST A ------------------------------------------ | zh-veth0(10.1.1.1) VM A | | ---|--- ...

  7. 代码的坏味道(21)——中间人(Middle Man)

    坏味道--中间人(Middle Man) 特征 如果一个类的作用仅仅是指向另一个类的委托,为什么要存在呢? 问题原因 对象的基本特征之一就是封装:对外部世界隐藏其内部细节.封装往往伴随委托.但是人们可 ...

  8. .NET应用程序域

    在.NET平台下,可执行程序并没有直接承载在Windows进程中,而非托管程序是直接承载的..NET可执行程序承载在进程的一个逻辑分区中,称之为应用程序域(AppDomain).一个进程可以包含多个应 ...

  9. java 设计模式

    目录: 设计模式六大原则(1):单一职责原则 设计模式六大原则(2):里氏替换原则 设计模式六大原则(3):依赖倒置原则 设计模式六大原则(4):接口隔离原则 设计模式六大原则(5):迪米特法则 设计 ...

  10. FreeMarker:怎么使用

    第一个FreeMarker程序 1. 建立一个普通的java项目:testFreeMarker 2. 引入freemarker.jar包 3. 在项目目录下建立模板目录:templates 4. 在t ...