Hibernate中的多对多映射

1.需求

项目与开发员工

一个项目,有多个开发人员

一个开发人员,参与多个项目 【多对多】

2.实体bean设计

  Project:

public class Project {
    private int prj_id;
    private String prj_name;
    private Set<Developer> devs = new HashSet<Developer>();
    set...
    get...
}

  Developer:

public class Developer {
    private int d_id;
    private String d_name;
    private Set<Project> projects = new HashSet<Project>();
    set...
    get...
}

3.配置映射文件

  Project.hbm.xml

<?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 package="com.juaner.hibernate.project">
    <class name="Project" table="t_project">
        <!--主键-->
        <id name="prj_id" >
            <generator class="native"/>
        </id>
        <property name="prj_name"  type="string"/>
        <set cascade="save-update" inverse="true" name="devs" table="t_relation">
            <key column="prjid"></key>
            <many-to-many column="devid" class="Developer"/>
        </set>
    </class>

</hibernate-mapping>

  Developer.hbm.xml

<?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 package="com.juaner.hibernate.project">
    <class name="Developer" table="t_developer">
        <!--主键-->
        <id name="d_id">
            <generator class="native"/>
        </id>
        <property name="d_name" type="string"/>
        <set name="projects" table="t_relation" >
            <!--外键字段-->
            <key column="devid"></key>
            <many-to-many column="prjid" class="Project"/>
        </set>
    </class>

</hibernate-mapping>

4.保存数据

    @Test
    public void test1(){
        Session session = sf.openSession();
        session.beginTransaction();

        Project project_wuliu = new Project();
        project_wuliu.setPrj_name("物流系统");
        Project project_oa = new Project();
        project_oa.setPrj_name("OA系统");

        Developer developer_1 = new Developer();
        developer_1.setD_name("曹集");
        Developer developer_2 = new Developer();
        developer_2.setD_name("王睿");
        Developer developer_3 = new Developer();
        developer_3.setD_name("老张");

        project_wuliu.getDevs().add(developer_1);
        project_wuliu.getDevs().add(developer_2);

        project_oa.getDevs().add(developer_3);
        project_oa.getDevs().add(developer_2);

        session.save(project_wuliu);
        session.save(project_oa);
        session.save(developer_1);
        session.save(developer_2);
        session.save(developer_3);

        session.getTransaction().commit();
        session.clear();

    }

  此时,会生成9条sql语句:

        Hibernate: insert into t_project (prj_name) values (?)
        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_developer (d_name) values (?)
        Hibernate: insert into t_relation (prjid, devid) values (?, ?)
        Hibernate: insert into t_relation (prjid, devid) values (?, ?)
        Hibernate: insert into t_relation (prjid, devid) values (?, ?)
        Hibernate: insert into t_relation (prjid, devid) values (?, ?)
时间: 2024-10-08 20:51:21

Hibernate中的多对多映射的相关文章

Hibernate中的多对一映射

举最常见的员工与部门来举例子: Emp: 1 package org.ninth.entity; 2 3 import java.math.BigDecimal; 4 5 public class Emp implements java.io.Serializable { 6 7 private Integer id; 8 9 private Dept dept; 10 11 private String name; 12 13 private BigDecimal salary; 14 15

【Hibernate步步为营】--多对多映射具体解释

上篇文章具体讨论了一对多映射,在一对多映射中单向的关联映射会有非常多问题,所以不建议使用假设非要採用一对多的映射的话能够考虑使用双向关联来优化之间的关系,一对多的映射事实上质上是在一的一端使用<many-to-one>标签来标明它们之间的关系,另外还须要在一的一端的对象中使用set标明集合映射. 一.单向多对多 仍然依照前几篇的文章格式来讨论.首先来看对象之间的关系,单向的多对多关系是两个对象之间发生的,比方在人和职位之间,一个人能够有多个职位,并且一个职位也能够由多人来负责,所以它们之间就形

【Hibernate步步为营】--多对多映射详解

上篇文章详细讨论了一对多映射,在一对多映射中单向的关联映射会有很多问题,所以不建议使用如果非要采用一对多的映射的话可以考虑使用双向关联来优化之间的关系,一对多的映射其实质上是在一的一端使用<many-to-one>标签来标明它们之间的关系,另外还需要在一的一端的对象中使用set标明集合映射. 一.单向多对多 仍然按照前几篇的文章格式来讨论,首先来看对象之间的关系,单向的多对多关系是两个对象之间发生的,比如在人和职位之间,一个人可以有多个职位,而且一个职位也可以由多人来负责,所以它们之间就形成了

hibernate(四) 双向多对多映射关系

序言 莫名长了几颗痘,真TM疼,可能是现在运动太少了,天天对着电脑,决定了,今天下午花两小时去跑步了, 现在继上一章节的一对多的映射关系讲解后,今天来讲讲多对多的映射关系把,明白了一对多,多对多个人感觉还是比较容易的,需要理清楚其数据库关系图,那么你就拿下了它.映射文件的配置还是那么些死东西. --WH 一.小疑问的解答 问题一:到这里,有很多学习者会感到困惑,因为他不知道使用hibernate是不是需要自己去创建表,还是hibernate全自动,如果需要自己创建表,那么主外键这种设置也是自己设

hibernate中基于主键映射1-1关联关系和基于外键映射1-1关联关系的不同

基于主键映射1-1关联关系和基于外键映射1-1关联关系的不同,主要区别是在配置映射文件上会有区别 两个持久化类为Manager和Department 1:基于主键映射1-1关联关系 1)使用其他持久化类的主键生成主键的实体的映射文件 首先需要指定主键生成方式为foreigner 格式为: <id name="departmentId" type="java.lang.Integer"> <column name="department_i

--------------Hibernate学习(四) 多对一映射 和 一对多映射

现实中有很多场景需要用到多对一或者一对多,比如上面这两个类图所展现出来的,一般情况下,一个部门会有多名员工,一名员工只在一个部门任职. 多对一关联映射 在上面的场景中,对于Employee来说,它跟Department的关系就是多对一. 先写实体类 Employee.java package entity; public class Employee { public int id; public String name; public Department department; public

Hibernate中的多对多关系详解(3)?

前面两节我们讲到了一对一的关系,一对多,多对一的关系,相对来说,是比较简单的,但有时,我们也会遇到多对多的关系,比如说:角色与权限的关系,就是典型的多对多的关系,因此,我有必要对这种关系详解,以便大家一起学习.下面来看例子: 首先我们必须建立二者的vo: public class Role implements Serializable {//这是role对象 private Integer rid; private String rdesc; private String rname; pri

Hibernate 中 联合主键映射 组合关系映射 大对象映射(或者说文本大对象,二进制数据大对象)

Clob:文本大对象,最长4G Blob:二进制数据大对象,最长4G util: public class HibUtil { private static SessionFactory sessionFactory; static{ //获取配置信息 hibernate.cfg.xml Configuration configuration = new Configuration().configure(); //创建一个 ServiceRegistry的实例 //首先获得其标准建造器,此处用

Hibernate中双向多对多的两种配置方式

1.建立多对多双向关联关系 1 package cn.happy.entitys; 2 3 import java.util.HashSet; 4 import java.util.Set; 5 6 public class Employee { 7 private Integer empid; 8 private String empname; 9 private Set<ProEmp> emps = new HashSet<ProEmp>(); 10 11 public Set