欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

hibernate一对多&多对多关系的操作(四)

程序员文章站 2022-03-22 18:43:44
一 数据库表与表之间的关系 总共有一对多关系、多对多关系和一对一关系三种一对多建表原则:在多的一方添加外键,指向1的一方多对多建表原则:必须通过中间表一对一建表原则:可以是建成一张表的(了解) 二 hibernate一对多关联映射 (一)1.准备工作:创建Java project,导入需要的jar包 ......

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

总共有一对多关系、多对多关系和一对一关系三种
一对多建表原则:在多的一方添加外键,指向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();
    }

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

hibernate一对多&多对多关系的操作(四)

中间遇到的问题:当时只保存了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();
        
    }

操作成功图

hibernate一对多&多对多关系的操作(四)

 

 (三)级联删除

    @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表 中间表

hibernate一对多&多对多关系的操作(四)

hibernate一对多&多对多关系的操作(四)

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

@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();
    }