zoukankan      html  css  js  c++  java
  • hibernate框架一对多&多对多关系的操作(四)

    一 数据库表与表之间的关系

    总共有一对多关系、多对多关系和一对一关系三种
    一对多建表原则:在多的一方添加外键,指向1的一方
    多对多建表原则:必须通过中间表
    一对一建表原则:可以是建成一张表的(了解)

    二 hibernate一对多关联映射

    (一)1.准备工作:创建Java project,导入需要的jar包,在数据库中创建客户和联系人的表(客户是一的一方,联系人是多的一方)

    导入工具类

    2.创建Customer实体类,提供get/set方法(这里由于空间问题省略了)

    public class Customer {
        //这是一的一方
        private Long  cust_id;        
        private String cust_name;
        private String cust_source;
        private String cust_industry;
        private String cust_level;
        private String cust_phone;
        private String cust_mobile;
        private Set<LinkMan> sets=new HashSet<LinkMan>();
    }

    创建LinkMan实体类

    public class LinkMan {
        private Long lkm_id;
        private String lkm_name;
        private String lkm_gender;
        private String lkm_phone;
        private String lkm_mobile;
        private String lkm_email;
        private String lkm_qq;
        private String lkm_position;
        private String lkm_memo;
        private Customer customer;
       }

    3 Customer的一的一方的配置文件

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE hibernate-mapping PUBLIC 
        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
     <hibernate-mapping>
                                                 <!--table是表名  -->
         <class name="com.itheima.domain.Customer" table="cst_customer">
             <id name="cust_id" column="cust_id" >
                 <generator class="native"/>
             </id>
             
                <!-- 与普通字段建立对应关系 -->
                <property name="cust_name" column="cust_name"/>
                <property name="cust_source" column="cust_source"/>
                <property name="cust_industry" column="cust_industry"/>
                <property name="cust_level" column="cust_level"/>
                <property name="cust_phone" column="cust_phone"/>
                <property name="cust_mobile" column="cust_mobile"/>
            <set name="sets" cascade="save-update,delete" inverse="true" >
                <key column="lkm_cust_id"/>
                <one-to-many class="com.itheima.domain.LinkMan"/>
            </set>
         </class>
     </hibernate-mapping>

    多的一方LinkMan的映射文件

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE hibernate-mapping PUBLIC 
        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
    <hibernate-mapping>
        <class name="com.itheima.domain.LinkMan" table="cst_linkman">
            <id name="lkm_id" column="lkm_id">
                <generator class="native"/>
            </id>
            <property name="lkm_name"/>
            <property name="lkm_gender"/>
            <property name="lkm_phone"/>
            <property name="lkm_mobile"/>
            <property name="lkm_email"/>
            <property name="lkm_qq"/>
            <property name="lkm_position"/>
            <property name="lkm_memo"/>
            <!-- 这是多的一方,many打头 -->
            <!-- 这里面是三个参数 -->
            <many-to-one name="customer" cascade="save-update" class="com.itheima.domain.Customer" column="lkm_cust_id"/>
                
            
        </class>
    </hibernate-mapping>

    4 创建核心配置文件

    5编写测试类

    @Test
        public void testDemo1(){
            Session session = HibernateUtils.getCurrentSession();
            Transaction ts = session.beginTransaction();
            //两个客户,三个联系人
            Customer customer1=new Customer();
            customer1.setCust_name("张三");
            Customer customer2=new Customer();
            customer2.setCust_name("李四");
            
            LinkMan linkMan1=new LinkMan();
            linkMan1.setLkm_name("小红");
            LinkMan linkMan2=new LinkMan();
            linkMan2.setLkm_name("小花");
            LinkMan linkMan3=new LinkMan();
            linkMan3.setLkm_name("小绿");
            
            //设置关系
            linkMan1.setCustomer(customer1);
            linkMan2.setCustomer(customer1);
            linkMan3.setCustomer(customer2);
            
            customer1.getSets().add(linkMan1);
            customer1.getSets().add(linkMan2);
            customer2.getSets().add(linkMan3);
            
            session.save(linkMan1);
            session.save(linkMan2);
            session.save(linkMan3);
            session.save(customer1);
            session.save(customer2);
            ts.commit();
        }

    成功图:成功插入两个客户,三个联系人

    中间遇到的问题:当时只保存了customer客户,没有保存联系人,报了瞬时对象异常

    (二)一对多的级联操作

    什么叫级联
    级联指的是操作一个对象的时候是否会同时操作其关联的对象
    级联是有方向性的

    保存客户级联联系人

        <set name="sets" cascade="save-update" >
    @Test
        /**
         * 保存客户级联联系人,操作的主体是客户
         */
        public void demo2(){
            Session session = HibernateUtils.getCurrentSession();
            Transaction ts = session.beginTransaction();
            
            Customer customer=new Customer();
            customer.setCust_name("大鸿");
            LinkMan man=new LinkMan();
            man.setLkm_name("张三");
            man.setCustomer(customer);
            customer.getSets().add(man);
            session.save(customer);
            ts.commit();
            
        }

    操作成功图

     (三)级联删除

        @Test
        /**
         * 级联删除
         * 删除客户,同时删除联系人,操作的客户主体是客户,更改xml中的配置
         * <set name="sets" cascade="delete" >
         * 
         */
        public void demo5(){
            Session session = HibernateUtils.getCurrentSession();
            Transaction ts = session.beginTransaction();
            Customer customer = session.get(Customer.class, 1l);
            session.delete(customer);
            ts.commit();
            
        }

    xml中的配置

    <set name="sets" cascade="delete" >

    结果:把一号客户删除,同时删除1号对应的联系人。

    三 hibernate多对多关联映射

     (一)1.创建实体类User

    public class User {
        private Long user_id;
        private String user_code;
        private String user_name;
        private String user_password;
        private String user_state;
        private Set<Role> roles=new HashSet<Role>();
       }

    创建实体类Role

    public class Role {
        private Long role_id;
        private String role_name;
        private String role_memo;
        private Set<User> users =new HashSet<User>();
       }

    2 创建User实体的映射

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE hibernate-mapping PUBLIC 
        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
    <hibernate-mapping>
        <class name="com.itheima.domain.User" table="sys_user">
            <id name="user_id" column="user_id">
                    <!-- 主键生成策略 -->
                <generator class="native"/>
            </id>
            <property name="user_code"/>
            <property name="user_name"/>
            <property name="user_password"/>
            <property name="user_state"/>
            <set name="roles" table="sys_user_role" cascade="save-update,delete" >
                <key column="user_id"/>
                <many-to-many class="com.itheima.domain.Role" column="role_id" />
            </set>
        </class>
    </hibernate-mapping>

    创建Role实体的映射

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE hibernate-mapping PUBLIC 
        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
    <hibernate-mapping>
        <class name="com.itheima.domain.Role" table="sys_role">
            <id name="role_id" column="role_id">
                <generator class="native"/>
            </id>
            <property name="role_name"/>
            <property name="role_memo"/>
            <set name="users" table="sys_user_role" inverse="true" >
                <key column="role_id"/>
                <many-to-many class="com.itheima.domain.User" column="user_id"  />
                    
            
            </set>
        </class>
    </hibernate-mapping>

    3创建核心配置文件,注意引入映射文件

    4创建测试类,保存用户级联角色,在User 的映射文件中配置cascade="save-update" 

    @Test
        /**
         * 保存用户级联角色,操作的主体是用户
         */
        public void dmeo2() {
            //两个用户,三个角色
            Session session=HibernateUtils.getCurrentSession();
            Transaction ts=session.beginTransaction();
            User user1=new User();
            user1.setUser_name("王六");
        
            Role role1=new Role();
            role1.setRole_name("公关部");
            
            user1.getRoles().add(role1);
            role1.getUsers().add(user1);
        
            session.save(user1);
            ts.commit();
        }

    成功图:User表 Role表 中间表

    (二)给用户添加一个角色

    @Test
        public void demo4(){
    
            Session session=HibernateUtils.getCurrentSession();
            Transaction ts=session.beginTransaction();
            //给四号用户添加一个12号的角色
            //先获得四号用户
            User user=session.get(User.class, 4l);
            Role role=session.get(Role.class, 12l);
            //获得所有的角色,再新添加一个
            user.getRoles().add(role);
            ts.commit();
        }

    (三)给用户更改一个角色

    @Test
        public void demo5(){
            //给用户改选角色,将原来的10号角色改为11号角色
            Session session=HibernateUtils.getCurrentSession();
            Transaction ts=session.beginTransaction();
        
            //先获得四号用户
            User user=session.get(User.class, 4l);
            Role role10=session.get(Role.class, 10l);
            Role role11=session.get(Role.class, 11l);
            user.getRoles().remove(role10);
            user.getRoles().add(role11);
            ts.commit();
        }
  • 相关阅读:
    用一个测试类简化排序算法时间复杂度的研究
    用斗地主的实例学会使用java Collections工具类
    数据结构:用实例分析ArrayList与LinkedList的读写性能
    用一个通俗易懂的例子彻底说清楚单例模式
    用自定义链式栈解决力扣括号匹配问题
    数据结构之链式队列的代码实现及有趣应用
    用非常硬核的JAVA序列化手段实现对象流的持久化保存
    SpringBoot整合SpringSecurity实现JWT认证
    六百字搞懂lambda
    判空我推荐StringUtils.isBlank
  • 原文地址:https://www.cnblogs.com/bao6/p/10347781.html
Copyright © 2011-2022 走看看