Hibernate初探之多对多映射

来源:互联网 发布:linux查看acl 编辑:程序博客网 时间:2024/06/05 04:05

多对多的应用场景

企业项目开发过程中

  • 一个项目可由多个员工参与开发
  • 一个员工可同时参与开发多个项目

多对多关联(many-to-many)

    多对多关联也是常见的一种关联关系,如项目和员工之间就是典型的多对多关系。
    雇员表 >> 雇员信息    项目表  >> 项目信息
    多对多关联一般采用中间表的形式来表现,即新增一张包含关联双方主键的关联表
    多对多关联可以使用<set>元素和<many-to-many>元素进行配置

创建项目和表

    1.创建Java工程hibernate-many2many
    2.创建主配置文件hibernate.cfg.xml
    3.创建init.sql   
create table project(    proid int primary key,    proname varchar(20) not null);create table employee(    empid int primary key,    empname varchar(20));create table proemp(    rproid int,    rempid int);alter table proemp add constraint fk_rproid    foreign key (rproid) references project(proid);alter table proemp add constraint fk_rempid    foreign key (rempid) references employee(empid);
    4、创建持久类和映射文件
    Project.java  与Employee类似
public class Project {private int proid;private String proname;// 添加一个员工 的集合private Set<Employee> employees = new HashSet<Employee>();        //无参构造        //有参构造        //getter and setter}
    5.配置映射文件
Project.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><class name="com.lijy.entity.Project" table="project">    <id name="proid" column="proid" type="java.lang.Integer">        <generator class="assigned"></generator>    </id>    <property name="proname" type="java.lang.String">        <column name="proname" length="20"></column>    </property>    <!-- 设置多对多关联关系 -->    <set name="employees" table="proemp">        <key column="rproid"></key>        <many-to-many class="com.lijy.entity.Employee" column="rempid"></many-to-many>    </set></class></hibernate-mapping>
Employee.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><class name="com.lijy.entity.Employee" table="employee">    <id name="empid" column="empid" type="java.lang.Integer">        <generator class="assigned"></generator>    </id>    <property name="empname" type="java.lang.String">        <column name="empname" length="20" not-null="true"></column>    </property>    <!-- 多对多关联关系 -->    <set name="projects" table="proemp">        <key column="rempid"></key>        <many-to-many class="com.lijy.entity.Project" column="rproid"></many-to-many>    </set></class></hibernate-mapping>

测试

package com.lijy.test;import org.hibernate.Session;import org.hibernate.Transaction;import com.lijy.entity.Employee;import com.lijy.entity.Project;import com.lijy.util.HibernateUtil;/** * 多对多关联联系的配置 * 同时建立了Project和Employee之间的双向多对多关联关系 * 关联关系的维护交由Project方来维护处理,并且在保存Project对象时会一并保存Employee对象 */public class Test {    public static void main(String[] args) {    Project project1 = new Project(1001, "项目1");    Project project2 = new Project(1002, "项目2");    Employee employee1 = new Employee(1, "张三");    Employee employee2 = new Employee(2, "李四");        //参加项目1的员工有张三和李四    project1.getEmployees().add(employee1);    project1.getEmployees().add(employee2);    //参加项目2的员工有张三    project2.getEmployees().add(employee1);        Session session = HibernateUtil.getSession();    Transaction tx = session.beginTransaction();    session.save(project1);    session.save(project2);    tx.commit();    HibernateUtil.closeSession();}}
    如果由Project方来维护,在Project.hbm.xml的set中设置级联方式cascade="all",并且在Employee.hbm.xml中的set设置inverse="true"

总结:

    实现多对多关联关系
    在数据库底层通过添加中间表来指定关联关系
        在 双方的实体中添加一个保存对象的集合
        在双方映射文件中使用<set>元素和<many-to-many>元素进行关联关系的配置。

引用:

    慕课网





原创粉丝点击