一:多对一单向关联

首先我们必须创建两个实体类

例如:Dept类

public class Dept {
private Integer deptNo;
private String  dName;
private String loc;
private  Set<Employee> emps=new HashSet<Employee>();

Employee类

public class Employee {

     private Integer empno;
     private String ename;

     private  Dept dept;

 

现在我们可以在配置文件里面配置了

Dept.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.entity">
    <class name="Dept" table="Dept">
        <id name="deptNo" column="deptNo">
            <generator class="native"/>
        </id>
        <property name="dName" type="string" column="dName"/>
           <property name="loc" type="string" column="loc"/>
           <!--cascade:级联     inverse:反转 -->
           <set name="emps" cascade="save-update" inverse="true" >
           <key column="deptNo"></key>
           <!--一对多  -->
           <one-to-many class="Employee"/>
           </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 package="cn.entity">
    <class name="Employee" table="Employee">
        <id name="empno" column="empno">
            <generator class="native"/>
        </id>
        <property name="ename" type="string" column="ename"/>
        <!--多对一  -->
        <many-to-one name="dept" column="deptNo" class="Dept"></many-to-one>

        <set name="projects" inverse="true" table="proemp">
        <key column="rempNo"></key>
        <many-to-many class="Project" column="rproNo"></many-to-many>
        </set>
    </class>
</hibernate-mapping>

到这里,一对多 和多对一的关联 配置已经完成!!

我们一起来看看测试类

// 添加数据
    private static void addDeptAndEmployee() {
        Session currentSession = HibernateUtil.currentSession();
        currentSession.beginTransaction();
        Dept dept = new Dept();
        //dept.setDeptNo(deptNo)
        dept.setdName("质管部22");
        dept.setLoc("北京22");
        Employee emp = new Employee();
        emp.setEname("龙龙");
        emp.setDept(dept);//建立dept 到employee 对象的 关联
        currentSession.save(emp);
        currentSession.save(dept);
        currentSession.getTransaction().commit();
        HibernateUtil.closeSessio();
        System.out.println("add  ok");

    }

 

// 级联保存   cascade:级联
    private static void addDeptAndEmployeeTocascade() {
        Session currentSession = HibernateUtil.currentSession();
        currentSession.beginTransaction();
        Dept dept = new Dept();
        // dept.setDeptNo(deptNo)
        dept.setdName("质管部22");
        dept.setLoc("北京22");
        Employee emp = new Employee();
        emp.setEname("龙龙");
        // 建立Dept对象 和Employee 对象的 一对多 双向关系
        emp.setDept(dept);
        dept.getEmps().add(emp);//
        currentSession.save(dept);
        currentSession.getTransaction().commit();
        HibernateUtil.closeSessio();
        System.out.println("add  ok");

    }

 

我们谈到关联映射的多对多配置呢,有一种挺不好配置的,所以呢,就放到了这里给大家参考

第一种:建立多对多双向关联 拆成两个一对多

三个实体类

Employee

 private Integer empno;
     private String ename;

     private  Dept dept;
     );//集合 类 employee的属性
     );

Project

private Integer proNo;//项目的编号
private  String proName;//项目名称
private  Set<Employee> employees=new  HashSet<Employee>(0);//集合 类 employee的属性
private Set<ProEmp> pe=new HashSet<ProEmp>(0);

中间表

ProEmp

private Integer id;
    private Project pro;
    private Employee emp;

映射文件

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.three.entity">
    <class name="Employee" table="Employee">
        <id name="empno" column="empno">
            <generator class="native"/>
        </id>
        <property name="ename" type="string" column="ename"/>
    </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.three.entity">
    <class name="Project" table="Project">
        <id name="proNo" column="proNo">
            <generator class="native"/>
        </id>
        <property name="proName" type="string" column="proName"/>
    </class>
</hibernate-mapping>

ProEmp.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.three.entity">
    <class name="ProEmp" table="ProEmp">
        <id name="id" column="id">
            <generator class="native"/>
        </id>
          <!-- 与员工关联 -->
        <many-to-one name="emp" column="empno" class="Employee"></many-to-one>
   <!-- -与project关联 -->
     <many-to-one name="pro" class="Project" column="proNo"></many-to-one>
    </class>
</hibernate-mapping>

大配置文件hibernate.cfg.xml

<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
        "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
        "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
    <session-factory>
        <!-- Database connection settings -->
        <property name="connection.driver_class">
            oracle.jdbc.driver.OracleDriver
        </property>
        <property name="connection.url">
            jdbc:oracle:thin:@localhost:1521:orcl
        </property>
        <property name="connection.username">wgy</property>
        <property name="connection.password">jpp</property>

        <!-- JDBC connection pool (use the built-in) -->

        <property name="connection.pool_size">1</property>

        <!-- SQL dialect --><!-- SQL 方言 -->

        <property name="dialect">
            org.hibernate.dialect.Oracle10gDialect
        </property>

        <!-- Enable Hibernate's automatic session context management -->
        <!-- <property name="current_session_context_class">thread</property>
        -->
        <!-- Disable the second-level cache -->
        <!-- <property name="cache.provider_class">org.hibernate.cache.NoCacheProvider</property>
        -->
        <!-- Echo all executed SQL to stdout -->
        <property name="show_sql">true</property>

        <!-- Drop and re-create the database schema on startup -->
        <!--序列化  -->
        <property name="hbm2ddl.auto">create</property>
        <!-- <property name="hbm2ddl.auto">update</property> -->
        <!-- sql语句格式化 -->
        <property name="format_sql">true</property>
        <!-- 资源 -->

        <<mapping resource="cn/three/entity/Dept.hbm.xml" />
         <mapping resource="cn/three/entity/Employee.hbm.xml" />
         <mapping resource="cn/three/entity/Project.hbm.xml" /> 

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

测试类看一下效果

package cn.main;

import org.hibernate.Session;

import cn.three.entity.ProEmp;
import cn.three.entity.Employee;
import cn.three.entity.Project;
import cn.util.HibernateUtil;

public class ThreeTest {
public static void main(String[] args) {
    //三表一起
        threeAddEmpAndProAndProEmp();
}
private static void threeAddEmpAndProAndProEmp() {
    Session session = HibernateUtil.currentSession();
    session.beginTransaction();
    Employee emp=new Employee();
    Project pro=new Project();
    emp.setEname("李四");
    pro.setProName("一号项目");
    ProEmp pe=new ProEmp();
    pe.setEmp(emp);
    pe.setPro(pro);
    session.save(pro);
    session.save(emp);
    session.save(pe);
    session.getTransaction().commit();
    HibernateUtil.closeSessio();
    System.out.println("add ok");

}
}

第二种:不用拆成两个一对多

只需要两个映射文件,即可

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.entity">
    <class name="Employee" table="Employee">
        <id name="empno" column="empno">
            <generator class="native"/>
        </id>
        <property name="ename" type="string" column="ename"/>
        <!--多对一  -->
        <many-to-one name="dept" column="deptNo" class="Dept"></many-to-one>
        <!--多对多双向关联  -->
        <set name="projects" inverse="true" table="proemp">
        <key column="rempNo"></key>
        <many-to-many class="Project" column="rproNo"></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.entity">
    <class name="Project" table="Project">
        <id name="proNo" column="proNo">
            <generator class="native"/>
        </id>
        <property name="proName" type="string" column="proName"/>
      <!--配置单向多对多关联  -->
        <!-- 映射project 类的employees的属性 -->
        <!--cascade="save-update":表名保存或更新project对象时,会级联保存或更新与它关联的Employee对象  -->
        <set name="employees" table="proemp" cascade="save-update">
         <key column="rproNo"></key>
         <many-to-many class="Employee" column="rempNo"></many-to-many>
        </set>
    </class>
</hibernate-mapping>
测试类


复制代码
private static void addProToEmpAndEmpToPro() {
    Session session = HibernateUtil.currentSession();
    session.beginTransaction();
    Employee emp=new Employee();

    Project pro=new Project();

    emp.setEname("李四");

    pro.setProName("一号项目");

    pro.getEmployees().add(emp);
    session.save(pro);
    session.getTransaction().commit();
    HibernateUtil.closeSessio();
    System.out.println("add ok");

这样就可以了,有问题在线解答!!!!!

Hibernate关联映射 映射文件的配置的更多相关文章

  1. hibernate关联非主键注解配置

    现在有两张表:一张t_s_user用户表和t_s_user_serial_number用户序号表 CREATE TABLE `t_s_user` ( `id` ) NOT NULL, `email` ...

  2. hibernate映射xml文件配置之一对多,多对多

    一对多配置 [1]班级和学生模型 --->班级可容纳多个学生 --->学生只能属于一个班级 [2]一对多配置中的关系维护(inverse) --->一端放弃关系的维护 ---> ...

  3. Java三大框架之——Hibernate关联映射与级联操作

    什么是Hibernate中的关联映射? 简单来说Hibernate是ORM映射的持久层框架,全称是(Object Relational Mapping),即对象关系映射. 它将数据库中的表映射成对应的 ...

  4. Hibernate 配置文件与映射文件 总结

    hibernate是一个彻底的ORM(Object Relational Mapping,对象关系映射)开源框架. 一.Hibernate配置文件详解 Hibernate配置文件有两种形式:XML与p ...

  5. Hibernate关联映射及高级查询

    一.Hibernate中的关联关系 1.1.单向一对多关联关系 按照以下步骤配置hibernate中持久化类的一对多对象关联: (1).持久化类添加关联类的相关属性及getter/setter方法. ...

  6. 第六章 Hibernate关联映射

    第六章 hibernate关联映射一.本章知识点分为2部分:1.关联关系:单向多对一关联关系,双向一对多关联关系(含一对多关联关系),多对多关联关系2.延迟加载:类级别加载策略,一对多加载策略,多对一 ...

  7. 第三章Hibernate关联映射

    第三章Hibernate关联映射 一.关联关系 类与类之间最普通的关系就是关联关系,而且关联是有方向的. 以部门和员工为列,一个部门下有多个员工,而一个员工只能属于一个部门,从员工到部门就是多对一关联 ...

  8. 【转】hibernate中的映射文件xxx.hbm.xml详解总结

    一.Hibernate映射文件的作用: Hibernate映射文件是Hibernate与数据库进行持久化的桥梁 二,Hibernate映射文件主要内容:     (1).映射内容的定义: Hibern ...

  9. 分享知识-快乐自己:Hibernate 关联映射

    关联关系映射--概念: 关联关系是使用最多的一种关系,非常重要.在内存中反映为实体关系,映射到DB中为主外键关系. 实体间的关联,即对外键的维护.关联关系的发生,即对外键数据的改变. 外键:外面的主键 ...

随机推荐

  1. BAT“搅局”B2B市场,CIO们准备好了吗?

    "CIO必须灵活构建其所在企业的IT系统,深入业务,以应对日新月异的数字化业务环境."   BAT军团"搅局"B2B市场,CIO们准备好了吗? 庞大的企业级市场 ...

  2. Oracle中的commit详解

    本文转自 : http://blog.csdn.net/hzhsan/article/details/9719307 它执行的时候,你不会有什么感觉.commit在数据库编程的时候很常用,当你执行DM ...

  3. [Django]用户权限学习系列之Permission权限基本操作指令

    若需建立py文件进行测试,则在文件开始加入以下代码即可 #coding:utf-8 import os os.environ.setdefault("DJANGO_SETTINGS_MODU ...

  4. Collections

    2017-01-06  22:50:43 数据结构和算法 <如何学习数据结构?>:https://www.zhihu.com/question/21318658 <How do I ...

  5. DBCP 配置备注

    <property name="initialSize" value="5"></property> <property name ...

  6. MongoDB与PostgresQL无责任初步测试

    PostgresQL一秒能插入多少条记录,MongoDB呢?读取的情况又如何?我写了一些简单的程序,得出了一些简单的数据,贴在这里分享,继续往下阅读前请注意下本文标题中的“无责任”,这表示此测试结果不 ...

  7. IT公司的女流之辈

    声明:并不是对女性怎么怎么滴歧视, 我只是想陈述事实. 女性来IT公司工作, 真的适合吗? 如果是杰出女性也就罢了, 如果只是一般女性呢? 她能够像一般男性一样的 努力工作, 像牛马一样的工作? 在某 ...

  8. es6学习笔记

    class Point { constructor(x, y) { this.x = x; this.y = y; } static classMethod() { console.log('fath ...

  9. 在IDEA上跑eclipse开发的J2EE项目

    Context MacOS 10.12.1 IDEA ULTIMATE 2016.2 项目使用eclipse开发 项目使用SVN进修版本管理 核心步骤 检出项目,完成基本配置 从svn检出 当项目下载 ...

  10. Javascript刷题 》数组求和

    计算给定数组 arr 中所有元素的总和 输入描述: 数组中的元素均为 Number 类型 输入例子: sum([ 1, 2, 3, 4 ]) 输出例子: 10 解题方法 1.定义一个变量,将前面的和后 ...