本文解决问题:Hibernate 中配置项目(Project) 员工(Employee)   双向多对多关联

方案一:直接配置双向多对多

方案二:配置第三个关联类(xml)   将多对多查分开来(形成两个单向多对一关联   完成双向多对多关系)

方案一:直接配置双向多对多

创建Employee持久化类

 public class Employee implements java.io.Serializable {

 // Fields

 private Integer empid;

 private String empname;

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

 ...其他内容省略

 }

创建Project持久化类

public class Project implements java.io.Serializable {
private Integer proid;
private String proname;
private Set<Employee> employees = new HashSet<Employee>();
...其他内容省略
}

分别创建两个小配置文件(hbm.xml文件)

创建Employee.hbm.xml文件

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="cn.happy.daymanymany.Employee" table="EMPLOYEE">
<id name="empid" type="java.lang.Integer">
<column name="EMPID"/>
<generator class="sequence">
<param name="sequence">SEQ_ID</param>
</generator>
</id>
<property name="empname" type="java.lang.String">
<column name="EMPNAME" length="" not-null="true" />
</property>
<set name="projects" inverse="true" table="PROEMP">
<key column="REMPID"/><!-- 表PROEMP的外键REMPID -->
<many-to-many class="cn.happy.daymanymany.Project" column="RPROID" />
</set>
</class>
</hibernate-mapping>

创建Project.hbm.xml文件

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="cn.happy.daymanymany.Project" table="PROJECT">
<id name="proid" type="java.lang.Integer">
<column name="PROID"/>
<generator class="sequence">
<param name="sequence">SEQ_ID</param>
</generator>
</id>
<property name="proname" type="java.lang.String">
<column name="PRONAME" length="" not-null="true" />
</property>
<set name="employees" table="PROEMP" cascade="save-update">
<key column="RPROID" />
<many-to-many class="cn.happy.daymanymany.Employee" column="REMPID" />
</set>
</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 name="foo"> <property name="connection.driver_class">oracle.jdbc.OracleDriver</property>
<property name="connection.url">jdbc:oracle:thin:@localhost::HR</property>
<property name="connection.username">happy</property>
<property name="connection.password">happy</property> <property name="dialect">org.hibernate.dialect.OracleDialect</property>
<property name="show_sql">true</property>
<property name="format_sql">true</property>
<property name="hbm2ddl.auto">update</property> <mapping resource="cn/happy/daymanymany/Project.hbm.xml"/>
<mapping resource="cn/happy/daymanymany/Employee.hbm.xml"/>
</session-factory>
</hibernate-configuration>

书写测试类

public static SessionFactory factory;
// 创建Session对象
public static Session session;
// 通过代码块赋值
static {
factory = new Configuration().configure().buildSessionFactory();
session = factory.openSession();
}
@Test
public void addTest(){
Transaction tran = null;
try {
tran = session.beginTransaction();
//创建EMP对象
Employee emp=new Employee();
emp.setEmpname("李小龙");
//创建Pro对象
Project pro=new Project();
pro.setProname("海淀花园");
//指定工程需要的员工
pro.getEmployees().add(emp);
//指定员工所属的工程
emp.getProjects().add(pro);
session.save(pro);
// 事务提交
tran.commit();
System.out.println("成功");
} catch (Exception e) {
e.printStackTrace();
if (tran != null) {
tran.rollback();
}
throw new RuntimeException("错误");
} finally {
// 关闭session
session.close();
}
}
注意:双向多对多,还可以拆成两个多对一 <many-to-one name="emp" class="Employee">
          <column name="empid"></column>
</many-to-one>
<many-to-one name="pro" class="Project">
<column name="proid"></column>
</many-to-one> 方案二:配置第三个关联类(xml)   将多对多查分开来(形成两个单向多对一关联   完成双向多对多关系) (完成与上方同样的功能)分别创建 Employee类、Project类、ProEmp类 ...hbm.xml

创建Employee持久化类

public class Employee implements java.io.Serializable {
private Integer empid;
private String empname;
private Set<ProEmp> projects = new HashSet<ProEmp>();
...其他内容省略 getter() and setter()
}

创建Project持久化类

public class Project implements java.io.Serializable {
private Integer proid;
private String proname;
private Set<ProEmp> employees = new HashSet<ProEmp>();
...其他内容省略
}

创建ProEmp持久化类

public class ProEmp implements Serializable {
private Integer id;
private Project pro;
private Employee emp;

现在来看  拆分后就成了    Employee和Project  分别于ProEmp一对多单向关联的关系了    所以    Employee.hbm.xml和Project.hbm.xml就不必再去关注了。

直接就是ProEmp.hbm.xml 的配置了

创建ProEmp.hbm.xml

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="cn.happy.daymanymany">
<class name="ProEmp" table="PROEMP">
<id name="id" type="java.lang.Integer">
<column name="ID"/> <!-- PROEMP表id字段 -->
<generator class="sequence">
<param name="sequence">SEQ_ID</param>
</generator>
</id>
<!-- 配置PROEMP与Employee关联
      name:“emp” 指的是PROEMP 类中的相关字段
          “empid”指的是Employee 类主键列
     -->
<many-to-one name="emp" class="Employee">
<column name="empid"></column>
</many-to-one>
    <!-- 配置PROEMP与Employee关联
        name:“emp” 指的是PROEMP 类中的相关字段
            “empid”   指的是Employee 类主键列
     -->
  <many-to-one name="pro" class="Project">
   <column name="proid"></column>
  </many-to-one> </class>
  </hibernate-mapping>
测试方案二:
@Test
public void many_many_test3(){
Session session = HibernateUtil.getSession();
session.beginTransaction(); Employee emp1 = new Employee();
emp1.setEname("王哲2"); //Project project1 = new Project("1号项目");
ProEmp p = (ProEmp)session.load(ProEmp.class,new Integer()); ProEmp proemp = new ProEmp();
proemp.setEmp(emp1);
proemp.setPro(project1); session.save(emp1);
session.save(project1);
session.save(proemp); session.getTransaction().commit();
System.out.println("ok");
}




Hibernate 配置双向多对多关联的更多相关文章

  1. Hibernate 配置 双向 对多关联 (未完待续·······)

                   从生疏到熟练  是要经历多少遍的练习? 这答案只能向自己找. 以Student和Course为例,一个学生可以选多门课程,一门课程也可以被多个学生选取: 首先  我们创建 ...

  2. Hibernate框架双向多对多关联映射关系

    建立双向多对多关联关系    Project.java (项目表)                private Integer proid;                private Strin ...

  3. Hibernate双向多对多关联

    一.配置双向多对多关联 以Project类(项目)和Emp类(员工)为例: 1.创建Project类,并需要定义集合类型的Emp属性 public class Project { //编号 priva ...

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

    Hibernate中双向多对多的两种配置方式 1.建立多对多双向关联关系 package cn.happy.entitys; import java.util.HashSet; import java ...

  5. Hibernate ManyToOne Mappings 多对一关联映射

    Hibernate ManyToOne Mappings 多对一关联映射 Hibernate框架的使用步骤: 1.创建Hibernate的配置文件(hibernate.cfg.xml)2.创建持久化类 ...

  6. hibernate中配置单向多对一关联,和双向一对多,双向多对多

    什么是一对多,多对一? 一对多,比如你去找一个父亲的所有孩子,孩子可能有两个,三个甚至四个孩子. 这就是一对多 父亲是1 孩子是多 多对一,比如你到了两个孩子,它们都是有一个共同的父亲. 此时孩子就是 ...

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

    序言 莫名长了几颗痘,真TM疼,可能是现在运动太少了,天天对着电脑,决定了,今天下午花两小时去跑步了, 现在继上一章节的一对多的映射关系讲解后,今天来讲讲多对多的映射关系把,明白了一对多,多对多个人感 ...

  8. Java进阶知识07 Hibernate一对一双向外键关联(Annotation+XML实现)

    1.Annotation 注解版 1.1.创建Husband类和Wife类 package com.shore.model; import javax.persistence.Entity; impo ...

  9. hibernate一对一双向外键关联

    一对一双向外键关联:双方都持有对方的外键关联关系. 主控方和一对一单向外键关联的情况是一样的,主要的差异表现为,被空方需要添加: @OneToOne(mappedBy="card" ...

随机推荐

  1. Leetcode 115.不同的子序列

    不同的子序列 给定一个字符串 S 和一个字符串 T,计算在 S 的子序列中 T 出现的个数. 一个字符串的一个子序列是指,通过删除一些(也可以不删除)字符且不干扰剩余字符相对位置所组成的新字符串.(例 ...

  2. [luoguP2680] 运输计划(lca + 二分 + 差分)

    传送门 暴力做法 50 ~ 60 枚举删边,求最大路径长度的最小值. 其中最大路径长度运用到了lca 我们发现,求lca的过程已经不能优化了,那么看看枚举删边的过程能不能优化. 先把边按照权值排序,然 ...

  3. windows安装Reids

    1.下载windows版本,64位,3.0版本就可以 官网下载地址:http://redis.io/download github下载地址:https://github.com/MSOpenTech/ ...

  4. 文件处理: read、readline、 readlines()

    假设a.txt的内容如下所示: Hello Welcome What is the fuck.. 1. read([size])方法 read([size])方法:从文件当前位置起读取size个字节, ...

  5. [bzoj2097][Usaco2010 Dec]Exercise 奶牛健美操_贪心_树形dp_二分

    Exercise bzoj-2097 Usaco-2010 Dec 题目大意:题目链接 注释:略. 想法:题目描述生怕你不知道这题在考二分. 关键是怎么验证?我们想到贪心的删边. 这样的策略是显然正确 ...

  6. 常见mysql的数据迁移

    1.处理把A表中的部分列复制到B表中主要处理同一库. UPDATE T_EVENT EVE, T_IPMAP MAP SET EVE.c_staff_code = MAP.c_staff_code, ...

  7. CN Internet

    来自为知笔记(Wiz)

  8. Office EXCEL如何批量把以文本形式存储的数字转换为数字

    如果"以文本形式存储的数字"不多,则点击右边的感叹号,转换为数字即可.但是如果有几万个单元格就不能这样做了.   先把他旁边的一列填充为1(选中该列,然后按Ctrl+F查找,按列查 ...

  9. [学习笔记]JavaScript基础

    JavaScript概述 1. JavaScript定义 JavaScript是Netscape公司开发的一种基于对象和事件驱动的脚本语言.它是弱类型语言.仅仅能由浏览器解释运行. 当中: 脚本语言: ...

  10. Android首次启动时间长优化之预编译提取Odex

        提示!应用程序的安装有两种情况,第一:首次启动系统时安装.第二:系统启动完毕后安装. 本篇博文基于第一种安装场景.在系统首次启动的场景中,系统会对/system/app./system/pri ...