Hibernate学习-7-关系映射(多对多)

com.cx.entity.Developer

package com.cx.entity;

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

/**
 * Created by cxspace on 16-8-2.
 */
public class Developer {
    private int d_id;
    private String d_name;

    private Set<Project> projects = new HashSet<Project>();

    public int getD_id() {
        return d_id;
    }

    public void setD_id(int d_id) {
        this.d_id = d_id;
    }

    public String getD_name() {
        return d_name;
    }

    public void setD_name(String d_name) {
        this.d_name = d_name;
    }

    public Set<Project> getProjects() {
        return projects;
    }

    public void setProjects(Set<Project> projects) {
        this.projects = projects;
    }
}

com.cx.entity.Project

package com.cx.entity;

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

/**
 * Created by cxspace on 16-8-2.
 */
public class Project {
    private int pri_id;
    private String prj_name;
    // 一个项目对应多个员工
    private Set<Developer> developers = new HashSet<Developer>();

    public Set<Developer> getDevelopers() {
        return developers;
    }

    public void setDevelopers(Set<Developer> developers) {
        this.developers = developers;
    }

    public int getPri_id() {
        return pri_id;
    }

    public void setPri_id(int pri_id) {
        this.pri_id = pri_id;
    }

    public String getPrj_name() {
        return prj_name;
    }

    public void setPrj_name(String prj_name) {
        this.prj_name = prj_name;
    }
}

 

映射配置

<?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.cx.entity">

    <class name="Developer" table="t_developer">
        <id name="d_id">
            <generator class="native"></generator>
        </id>
        <property name="d_name" length="20"></property>
        <!--
        多对多映射关键
         1.映射的集合属性
         2.集合属性对应的中间表
         3.外键字段
         4.外键字段对应的中间表字段
         5.集合属性元素的类型

        -->

        <set name="projects" table="t_relation" cascade="save-update" >
            <key column="did"></key>
            <many-to-many column="prjId" class="Project"></many-to-many>
        </set>

    </class>

</hibernate-mapping>


----------------------------------------------------------------------------------

<?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.cx.entity">

    <class name="Project" table="t_project">
        <id name="pri_id">
            <generator class="native"></generator>
        </id>
        <property name="prj_name" length="20"></property>
        <!--
        多对多映射关键
         1.映射的集合属性
         2.集合属性对应的中间表
         3.外键字段
         4.外键字段对应的中间表字段
         5.集合属性元素的类型

        -->

        <set name="developers" table="t_relation" cascade="save-update" inverse="false" >
            <key column="prjId"></key>
            <many-to-many column="did" class="Developer"></many-to-many>
        </set>

    </class>

</hibernate-mapping>

测试类

package com.cx.test;

import com.cx.entity.Developer;
import com.cx.entity.Project;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import org.junit.Test;

/**
 * Created by cxspace on 16-8-2.
 */
public class ManyToMany {

    private static SessionFactory sf;
    static {
        sf = new Configuration()
                .configure()
                .addClass(Project.class)
                .addClass(Developer.class)   // 测试时候使用
                .buildSessionFactory();
    }

    // 多对多
    //1. 设置inverse属性,对保存数据影响?
    // 有影响。
    // inverse=false ,有控制权,可以维护关联关系; 保存数据的时候会把对象关系插入中间表;
    // inverse=true,  没有控制权, 不会往中间表插入数据。


    public void save(){
        Session session = sf.openSession();
        session.beginTransaction();

        Project prj_ds = new Project();
        prj_ds.setPrj_name("电商系统");
        Project prj_tx = new Project();
        prj_tx.setPrj_name("通讯软件");

        Developer dev_my = new Developer();
        dev_my.setD_name("马云");

        Developer dev_qd = new Developer();
        dev_qd.setD_name("强东");

        Developer dev_ht = new Developer();
        dev_ht.setD_name("化腾");

        //关系维护

        prj_ds.getDevelopers().add(dev_my);
        prj_ds.getDevelopers().add(dev_qd);

        prj_tx.getDevelopers().add(dev_ht);
        prj_tx.getDevelopers().add(dev_my);

        session.save(prj_ds);
        session.save(prj_tx);

        session.getTransaction().commit();
        session.close();

        /*
        *
        *  Hibernate:
                insert
                into
                    t_project
                    (prj_name)
                values
                    (?)
            Hibernate:
                insert
                into
                    t_developer
                    (d_name)
                values
                    (?)
            Hibernate:
                insert
                into
                    t_developer
                    (d_name)
                values
                    (?)
            Hibernate:
                insert
                into
                    t_project
                    (prj_name)
                values
                    (?)
            Hibernate:
                insert
                into
                    t_developer
                    (d_name)
                values
                    (?)
            Hibernate:
                insert
                into
                    t_relation
                    (prjId, did)
                values
                    (?, ?)
            Hibernate:
                insert
                into
                    t_relation
                    (prjId, did)
                values
                    (?, ?)
            Hibernate:
                insert
                into
                    t_relation
                    (prjId, did)
                values
                    (?, ?)
            Hibernate:
                insert
                into
                    t_relation
                    (prjId, did)
                values
                    (?, ?)
        *
        * */


    }

    //2 .设置inverse属性, 对获取数据影响?  无

    public void get(){
        Session session = sf.openSession();
        session.beginTransaction();

        Project prj = (Project)session.get(Project.class,1);
        System.out.println(prj.getPrj_name());

        System.out.println(prj.getDevelopers());

        session.getTransaction().commit();
        session.close();

    }

    //3. 设置inverse属性, 对解除关系影响?
    // 有影响。
    // inverse=false ,有控制权, 解除关系就是删除中间表的数据。
    // inverse=true, 没有控制权,不能解除关系。

    public void removeRelation() {

        Session session = sf.openSession();
        session.beginTransaction();

        Project prj = (Project) session.get(Project.class, 2);
        prj.getDevelopers().clear();

        session.getTransaction().commit();
        session.close();
    }

    //3. 设置inverse属性,对删除数据的影响?
    // inverse=false, 有控制权。 先删除中间表数据,再删除自身。
    // inverse=true, 没有控制权。 如果删除的数据有被引用,会报错! 否则,才可以删除
    @Test
    public void deleteData() {

        Session session = sf.openSession();
        session.beginTransaction();

        Project prj = (Project) session.get(Project.class, 1);
        session.delete(prj);

        session.getTransaction().commit();
        session.close();
    }
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值