zoukankan      html  css  js  c++  java
  • Hibernate 系列教程6-双向多对多

    双向多对多inverse配置

    如果关系两边都使用默认inverse=false配置,表示关系两边都可以管理中间表的数据

    关系其中一边设置inverse=true配置,表示自己放弃管理中间表关系,由对方来管理

    如果关系两边都使用默认inverse=true配置,表示关系两边都不管理中间表,是不能这样配置的

    hibernate.cfg.xml

    <mapping resource="com/jege/hibernate/two/way/manytomany/User.hbm.xml" />
    <mapping resource="com/jege/hibernate/two/way/manytomany/Role.hbm.xml" />

    User.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.jege.hibernate.two.way.manytomany">
        <class name="User" table="t_user">
            <id name="id">
                <generator class="native"/>
            </id>
            <property name="name" />
            <!-- 配置中间表t_user_role -->
            <set name="roles" table="t_user_role">
                <!-- 配置当前类User在中间表的主外键名称 -->
                <key column="user_id" />
                <!-- 多对多 -->
                <!-- class必须配置, column配置关联类Role在中间表的主外键名称 -->
                <many-to-many class="Role" column="role_id" />
            </set>
        </class>
    </hibernate-mapping>        

    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.jege.hibernate.two.way.manytomany">
        <class name="Role" table="t_role">
            <id name="id">
                <generator class="native" />
            </id>
            <property name="name" />
            <!-- 配置中间表t_user_role -->
            <set name="users" table="t_user_role">
                <!-- 配置当前类Role在中间表的主外键名称 -->
                <key column="role_id" />
                <!-- 多对多 -->
                <!-- class必须配置, column配置关联类User在中间表的主外键名称 -->
                <many-to-many class="User" column="user_id" />
            </set>
        </class>
    </hibernate-mapping>        

    Role

    private Long id;
    private String name;
    private Set<User> users = new HashSet<User>();

    User

    private Long id;
    private String name;
    private Set<Role> roles = new HashSet<Role>();

    CrudTest

    package com.jege.hibernate.two.way.manytomany;
    
    import org.hibernate.Session;
    import org.junit.Before;
    import org.junit.Test;
    
    import com.jege.hibernate.two.way.manytomany.Role;
    import com.jege.hibernate.two.way.manytomany.User;
    import com.jege.hibernate.util.HibernateUtils;
    
    /**
     * @author JE哥
     * @email 1272434821@qq.com
     * @description:多对多的处理
     */
    public class CrudTest {
    
      // 保存2个用户,保存3个角色(会出现5条insert语句)
      // 保存中间表:建立用户到角色关系jegeUser1(jegeRole1,jegeRole2),jegeUser2(jegeRole1,jegeRole2,jegeRole3)(会出现5条insert语句)
      // 一般保存的:需要写5个save方法
      @Before
      public void save() throws Exception {
        Session session = HibernateUtils.INSTANCE.getSession();
        session.beginTransaction();
        // 保存2个用户,保存3个角色(会出现5条insert语句)
        User jegeUser1 = new User("jegeUser1");
        session.save(jegeUser1);
        User jegeUser2 = new User("jegeUser2");
        session.save(jegeUser2);
    
        Role jegeRole1 = new Role("jegeRole1");
        session.save(jegeRole1);
        Role jegeRole2 = new Role("jegeRole2");
        session.save(jegeRole2);
        Role jegeRole3 = new Role("jegeRole3");
        session.save(jegeRole3);// (这里的5个save方法会出现5条insert语句)
    
        // 保存中间表:建立用户到角色关系jegeUser1(jegeRole1,jegeRole2),jegeUser2(jegeRole1,jegeRole2,jegeRole3)
        jegeUser1.getRoles().add(jegeRole1);
        jegeUser1.getRoles().add(jegeRole2);
    
        jegeUser2.getRoles().add(jegeRole1);
        jegeUser2.getRoles().add(jegeRole2);
        jegeUser2.getRoles().add(jegeRole3);
        jegeUser2.getRoles().add(jegeRole3);
    
        session.getTransaction().commit();// 事务里面,更新脏数据(会出现5条insert语句)
        session.close();
      }
    
      // 删除jegeUser1(由hibernate自动处理,流程是先删除中间表,在删除jegeUser1)
      @Test
      public void delete1() throws Exception {
        Session session = HibernateUtils.INSTANCE.getSession();
        User jegeUser = (User) session.get(User.class, 1L);
    
        session.beginTransaction();
        session.delete(jegeUser);
        session.getTransaction().commit();
    
        session.close();
      }
    
      // 删除jegeUser1的关联的角色(中间表),实现不能删除jegeUser1
      @Test
      public void delete2() throws Exception {
        Session session = HibernateUtils.INSTANCE.getSession();
        User jegeUser = (User) session.get(User.class, 1L);
    
        session.beginTransaction();
        jegeUser.getRoles().clear();
        session.getTransaction().commit();
    
        session.close();
      }
    
      // 删除jegeUser1的一个角色,实现不能删除jegeUser1
      @Test
      public void delete3() throws Exception {
        Session session = HibernateUtils.INSTANCE.getSession();
        User jegeUser = (User) session.get(User.class, 1L);
        Role jegeRole = (Role) session.get(Role.class, 1L);
    
        session.beginTransaction();
        jegeUser.getRoles().remove(jegeRole);
        session.getTransaction().commit();
    
        session.close();
      }
    
      // 修改角色:先删除jegeUser1.jegeRole2,在添加jegeUser1.jegeRole3
      // 关系jegeUser1(jegeRole1,jegeRole2)变为关系jegeUser1(jegeRole1,jegeRole3)
      @Test
      public void update() throws Exception {
        Session session = HibernateUtils.INSTANCE.getSession();
        User jegeUser = (User) session.get(User.class, 1L);
        Role jegeRole2 = (Role) session.get(Role.class, 2L);
        Role jegeRole3 = (Role) session.get(Role.class, 3L);
    
        session.beginTransaction();
        jegeUser.getRoles().remove(jegeRole2);
        jegeUser.getRoles().add(jegeRole3);
        session.getTransaction().commit();
    
        session.close();
      }
    
    }
    

    源码地址

    https://github.com/je-ge/hibernate

    如果觉得我的文章对您有帮助,请予以打赏。您的支持将鼓励我继续创作!谢谢!
    微信打赏
    支付宝打赏

  • 相关阅读:
    Oracle 11gR2中启动Scott用户的方法
    Oracle 11g服务器安装详细步骤——图文教程(系统 windows server 2012 R2)
    Windows 2012 安装 Oracle 11g 报错:[INS-13001]环境不满足最低要求。
    人民币的单位的大写
    Eclipse 快捷键总结
    Eclipse常用快捷键
    四种Sandcastle方法生成c#.net帮助类帮助文档
    Sandcastle方法生成c#.net帮助类帮助文档chm
    HTML:Input元素标签的详细介绍
    MySQL: 详细的sql语句
  • 原文地址:https://www.cnblogs.com/je-ge/p/6105429.html
Copyright © 2011-2022 走看看