zoukankan      html  css  js  c++  java
  • hibernate的映射之四(多对多双向关联)

    Many-to-Many 多对多的映射可以使用一组Java集合不包含任何重复的元素来实现。我们已经看到了Hibernate如何设置映射集合。

    集(SET)被映射到与映射表中<set>元素,并以java.util.HashSet初始化。您可以使用Set集合在类中时,集合不需要重复的元素。

    多对多双向关联:

    由于是双向关联,所以需要在二个实体中植入对方的实体集合。

    我依旧以员工和项目为例子。

    1.准备JavaBean(持久化类)

    员工实体类

    public class Employee {
    private Integer empid;
    private String empname;
    //植入项目集合 一个员工可以参与多个项目
    private Set<Project> projects=new HashSet<Project>();

    public Integer getEmpid() {
    return empid;
    }

    public void setEmpid(Integer empid) {
    this.empid = empid;
    }

    public String getEmpname() {
    return empname;
    }

    public void setEmpname(String empname) {
    this.empname = empname;
    }

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

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


    项目实体类
    public class Project {
    private Integer proid;
    private String proname;
    //植入员工集合 一个项目可以由多个人参与
    private Set<Employee> employees = new HashSet<Employee>();

    public Integer getProid() {
    return proid;
    }

    public void setProid(Integer proid) {
    this.proid = proid;
    }

    public String getProname() {
    return proname;
    }

    public void setProname(String proname) {
    this.proname = proname;
    }

    public Set<Employee> getEmployees() {
    return employees;
    }

    public void setEmployees(Set<Employee> employees) {
    this.employees = employees;
    }
    }



    2.创建持久化类的映射文件
    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 package="cn.day04mapping.manytomany.entity">
    <!--表名称-->
    <class name="Employee" table="EMPLOYEE" schema="root">
    <!--列名-->
    <id name="empid" column="EMPID">
    <!--主键生成的策略 native:自动生成主键字段-->
    <generator class="native"></generator>
    </id>
    <property name="empname" column="EMPNAME"></property>
    <!--单相关联-->
    <!--植入set 标签 table 中间表的表名-->
    <set name="projects" table="PROEMP">
    <!--column 多的一方表在中间表的外键列-->
    <key column="REMPID"></key>
    <!--column 中间表的另外一个外键列-->
    <many-to-many column="RPROID" class="Project"></many-to-many>
    </set>
    </class>
    </hibernate-mapping>


    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 package="cn.day04mapping.manytomany.entity">
    <!--表名称-->
    <class name="Project" table="PROJECT" schema="root">
    <!--列名-->
    <id name="proid" column="PROID">
    <!--主键生成的策略 native:自动生成主键字段-->
    <generator class="native"></generator>
    </id>
    <property name="proname" column="PRONAME"></property>

    <!--双相关联-->
    <!--植入set 标签 save-update 保存数据 inverse="true" 放弃维护 消除多余的update语句 false 主动维护 -->
    <set name="employees" table="PROEMP" cascade="save-update">
    <!--多的一方表的外键列-->
    <key column="RPROID"></key>
    <many-to-many column="REMPID" class="Employee"></many-to-many>
    </set>
    </class>
    </hibernate-mapping>



    3.hibernate.cfg.xml主配置文件

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE hibernate-configuration PUBLIC
    "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
    "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
    <hibernate-configuration>
    <session-factory>
    <!-- 指定数据库所用到的驱动 -->
    <property name="connection.driver_class">oracle.jdbc.driver.OracleDriver</property>
    <!-- 指定数据库链接的url,hibernate链接的数据库名 -->
    <property name="connection.url">jdbc:oracle:thin:@localhost:1521:orcl</property>
    <!-- 指定连接数据库的用户名 -->
    <property name="connection.username">root</property>
    <!-- 指定连接数据库的用户口令 -->
    <property name="connection.password">root</property>
    <!-- Enable Hibernate's automatic session context management -->
    <property name="current_session_context_class">thread</property>

    <!--格式化sql -->
    <property name="format_sql ">true</property>
    <!-- 打印sql 控制台-->
    <property name="show_sql">true</property>
    <!-- 指定数据库方言 -->
    <property name="dialect">org.hibernate.dialect.Oracle10gDialect</property>
    <!-- 根据需要自动创建数据库表 -->
    <property name="hbm2ddl.auto">update</property>

    <!--多对多-->
    <mapping resource="cn/day04mapping/manytomany/entity/Project.hbm.xml"></mapping>
    <mapping resource="cn/day04mapping/manytomany/entity/Employee.hbm.xml"></mapping>

    </session-factory>
    </hibernate-configuration>


    4.书写测试类和方法

    //多对多双向关联
    @Test
    public void test02(){
    Session session = HibernateUtil.getSession();
    //开启事务
    Transaction transaction = session.beginTransaction();
    //员工方
    Employee emp=new Employee();
    emp.setEmpname("马化腾");
    //员工方
    Employee emps=new Employee();
    emps.setEmpname("刘强东");
    //项目方 主的一方
    Project project=new Project();
    project.setProname("零售");

    project.getEmployees().add(emp);
    project.getEmployees().add(emps);
    //保存数据
    session.save(project);
    //提交事务
    transaction.commit();
    }



     


  • 相关阅读:
    PHP简单工厂模式、工厂方法模式和抽象工厂模式
    PHP的HashTable实现
    理解Hash
    PHP中Array的hash函数实现
    R-FCN论文讲解(转载链接)
    目标检测的发展历程
    K-means算法
    pytorch0.4.1安装
    反卷积(deconvolution)
    faster-rcnn自己的理解总结(包括它的前世今身R-CNN和fast R-CNN)
  • 原文地址:https://www.cnblogs.com/sujulin/p/8149897.html
Copyright © 2011-2022 走看看