本文解决问题: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. Spring security 5 Authorize Configuration

    1. Spring Security 核心请求,认证配置类 WebSecurityConfigurerAdapter protected void configure(HttpSecurity htt ...

  2. Spring Tool Suite 安装

    第一步:到http://spring.io/tools/sts/all/上下载对应版本.(此处以博主Windows64位系统为例) 第二步: 进入eclipse,依次点击help-->Insta ...

  3. 【Codeforces 364A】Matrix

    [链接] 我是链接,点我呀:) [题意] 让你求出b[i][j]=s[i]*s[j]规则构成的矩阵 的所有子矩阵中子矩阵的和为a的子矩阵的个数 [题解] (x,y,z,t) 会发现它的和就是sum(x ...

  4. 一文教你用 Neo4j 快速构建明星关系图谱

    更多有趣项目及代码见于:DesertsX/gulius-projects 前言 本文将带你用 neo4j 快速实现一个明星关系图谱,因为拖延的缘故,正好赶上又一年的4月1日,于是将文中的几个例子顺势改 ...

  5. Remmarguts’ Date(poj 2449)

    求第k短路的长度,如果没有,输出-1. /* k短路模板 注意当s=t时,k++. */ #include<iostream> #include<cstdio> #includ ...

  6. 过河(codevs 1155)

    题目描述 Description 在河上有一座独木桥,一只青蛙想沿着独木桥从河的一侧跳到另一侧.在桥上有一些石子,青蛙很讨厌踩在这些石子上.由于桥的长度和青蛙一次跳过的距离都是正整数,我们可以把独木桥 ...

  7. MyBatis启动:MapperStatement创建

    参考:http://blog.csdn.net/ashan_li/article/details/50351080 MappedStatement说明 一个MappedStatement对象对应Map ...

  8. 在Spring MVC和Spring Boot中使用thymeleaf模板

    Spring MVC: POM: <!-- thymeleaf模板 --> <!-- https://mvnrepository.com/artifact/org.thymeleaf ...

  9. Unity3d代码从Android/IOS迁移到WindowsPhone经验笔记

    [1搭建坏境] 推荐:Windows 8.1 Enterprise + Visual studio 2013(完整安装) PS: 假设要Visual Studio 2012,先安装VS再安装WP8/W ...

  10. [vs执行报错] CRT detected that the application wrote to memory after end of heap buffer

    CRT 是c/c++ run-time lib , 是程序执行时所需的核心库. 这个错误是由于以对内在操作的过程中.所写的地址超出了.所分配内在的边界 有个建议是: 1.内存申请多少释放多少,释放掉你 ...