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

1.建立多对多双向关联关系

 package cn.happy.entitys;

 import java.util.HashSet;
import java.util.Set; public class Employee {
private Integer empid;
private String empname;
private Set<ProEmp> emps = new HashSet<ProEmp>(); public Set<ProEmp> getEmps() {
return emps;
} public void setEmps(Set<ProEmp> emps) {
this.emps = emps;
} 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<ProEmp> getProjects() {
return projects;
} public void setProjects(Set<ProEmp> projects) {
this.projects = projects;
} private Set<ProEmp> projects = new HashSet<ProEmp>();
}

Employee.java

 <?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.happy.entitys"> <class name="Employee" table="EMPLOYEE">
<id name="empid" column="EMPID">
<generator class="sequence">
<param name="sequence">STU_SID</param>
</generator>
</id>
<property name="empname" type="string" column="EMPNAME"></property> <set name="projects" table="PROEMP" cascade="save-update">
<key column="REMPID"></key>
<many-to-many class="Project" column="RPROID"></many-to-many>
</set> </class> </hibernate-mapping>

Employee.hbm.xml

 package cn.happy.entitys;

 import java.util.Set;

 public class Project {
private Integer proid;
private String proname;
private Set<ProEmp> pros;
public Integer getProid() {
return proid;
}
public Set<ProEmp> getPros() {
return pros;
}
public void setPros(Set<ProEmp> pros) {
this.pros = pros;
}
public void setProid(Integer proid) {
this.proid = proid;
}
public String getProname() {
return proname;
}
public void setProname(String proname) {
this.proname = proname;
}
}

Project.java

 <?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.happy.entity"> <class name="Project" table="PROJECT">
<id name="proid" column="PROID">
<generator class="sequence">
<param name="sequence">STU_SID</param>
</generator>
</id>
<property name="proname" type="string" column="PRONAME"></property>
<set name="employeses" table="PROEMP" cascade="save-update">
<key column="RPROID"></key>
<many-to-many class="Employee" column="REMPID"></many-to-many>
</set>
</class> </hibernate-mapping>

Project.hbm.xml

中间关系表

 package cn.happy.entitys;

 public class ProEmp {
private Integer id;
private Project pro;
private Employee emp; public Integer getId() {
return id;
} public void setId(Integer id) {
this.id = id;
} public Project getPro() {
return pro;
} public void setPro(Project pro) {
this.pro = pro;
} public Employee getEmp() {
return emp;
} public void setEmp(Employee emp) {
this.emp = emp;
}
}

ProEmp.java

 <?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.OracleDriver</property>
<property name="connection.url">jdbc:oracle:thin:@localhost:1521:orcl</property>
<property name="connection.username">hmy</property>
<property name="connection.password">hmy</property> <!-- SQL dialect SQL方言-->
<property name="dialect">org.hibernate.dialect.Oracle10gDialect</property> <!-- Echo all executed SQL to stdout 控制台显示-->
<property name="show_sql">true</property>
<!-- Enable Hibernate's automatic session context management -->
<property name="current_session_context_class">thread</property>
<!-- 是否格式化 -->
<property name="format_sql">true</property> <!-- Drop and re-create the database schema on startup -->
<property name="hbm2ddl.auto">create</property> <!-- <mapping resource="cn/happy/entity/Student.hbm.xml" /> -->
<!-- <mapping resource="cn/happy/entity/grade.hbm.xml" /> -->
<!-- <mapping class="cn.happy.entity.Grade"/> -->
<!-- <mapping resource="cn/happy/entity/Dept.hbm.xml" />
<mapping resource="cn/happy/entity/Emp.hbm.xml" /> -->
<mapping resource="cn/happy/entity/Employee.hbm.xml" />
<mapping resource="cn/happy/entity/Project.hbm.xml" /> <!-- <mapping resource="cn/happy/entitys/Employee.hbm.xml" />
<mapping resource="cn/happy/entitys/Project.hbm.xml" />
<mapping resource="cn/happy/entitys/ProEmp.hbm.xml" /> --> </session-factory> </hibernate-configuration>

hibernate.hbm.xml

 package cn.happy.ui;

 import org.hibernate.Session;
import org.hibernate.Transaction; import cn.happy.entity.Employee;
import cn.happy.entity.Project;
import cn.happy.util.HibernateUtil; public class Test3 {
public static void main(String[] args) {
select();
} /**
* 检索
* */
public static void select(){
Session session = HibernateUtil.currentSession();
Project pro = (Project)session.load(Project.class, 1);
for (Employee item : pro.getEmployeses()) {
System.out.println("员工:"+item.getEmpname()+"\t参加的项目:");
for (Project project : item.getProjects()) {
System.out.println(project.getProname());
}
}
HibernateUtil.closeSession();
} /**
* 添加
* */
public static void one(){
Session session = HibernateUtil.currentSession();
Transaction tx = session.beginTransaction(); Project pro=new Project();
pro.setProname("ADO"); Employee emp=new Employee();
emp.setEmpname("范子阳");
Employee emp2=new Employee();
emp2.setEmpname("李夏鹏"); pro.getEmployeses().add(emp);
pro.getEmployeses().add(emp2); //未声明级联
//emp.getProjects().add(pro);
//emp2.getProjects().add(pro); session.save(pro); tx.commit();
HibernateUtil.closeSession();
}
}

测试类

2.建立多对多双向关联 拆成两个一对多

 package cn.happy.entitys;

 import java.util.HashSet;
import java.util.Set; public class Employee {
private Integer empid;
private String empname;
private Set<ProEmp> emps = new HashSet<ProEmp>(); public Set<ProEmp> getEmps() {
return emps;
} public void setEmps(Set<ProEmp> emps) {
this.emps = emps;
} 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<ProEmp> getProjects() {
return projects;
} public void setProjects(Set<ProEmp> projects) {
this.projects = projects;
} private Set<ProEmp> projects = new HashSet<ProEmp>();
}

Employee.java

 <?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.happy.entitys"> <class name="Employee" table="EMPLOYEE">
<id name="empid" column="EMPID">
<generator class="sequence">
<param name="sequence">STU_SID</param>
</generator>
</id> </class> </hibernate-mapping>

Employee.hbm.xml

 package cn.happy.entitys;

 import java.util.Set;

 public class Project {
private Integer proid;
private String proname;
private Set<ProEmp> pros;//为中间关系表所对应的实体类的类型
public Integer getProid() {
return proid;
}
public Set<ProEmp> getPros() {
return pros;
}
public void setPros(Set<ProEmp> pros) {
this.pros = pros;
}
public void setProid(Integer proid) {
this.proid = proid;
}
public String getProname() {
return proname;
}
public void setProname(String proname) {
this.proname = proname;
}
}

Project.java

 <?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.happy.entitys"> <class name="Project" table="PROJECT">
<id name="proid" column="PROID">
<generator class="sequence">
<param name="sequence">STU_SID</param>
</generator>
</id>
<property name="proname" type="string" column="PRONAME"></property> </class> </hibernate-mapping>

Project.hbm.xml

 package cn.happy.entitys;

 public class ProEmp {
private Integer id;
private Project pro;
private Employee emp; public Integer getId() {
return id;
} public void setId(Integer id) {
this.id = id;
} public Project getPro() {
return pro;
} public void setPro(Project pro) {
this.pro = pro;
} public Employee getEmp() {
return emp;
} public void setEmp(Employee emp) {
this.emp = emp;
}
}

ProEmp.java

 <?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.happy.entitys"> <class name="ProEmp" table="PROEMP">
<id name="id" column="ID">
<generator class="sequence">
<param name="sequence">STU_SID</param>
</generator>
</id> <many-to-one name="emp" class="Employee" column="empid"></many-to-one>
<many-to-one name="pro" class="Project" column="proid"></many-to-one>
</class> </hibernate-mapping>

ProEmp.hbm.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.OracleDriver</property>
<property name="connection.url">jdbc:oracle:thin:@localhost:1521:orcl</property>
<property name="connection.username">hmy</property>
<property name="connection.password">hmy</property> <!-- SQL dialect SQL方言-->
<property name="dialect">org.hibernate.dialect.Oracle10gDialect</property> <!-- Echo all executed SQL to stdout 控制台显示-->
<property name="show_sql">true</property>
<!-- Enable Hibernate's automatic session context management -->
<property name="current_session_context_class">thread</property>
<!-- 是否格式化 -->
<property name="format_sql">true</property> <!-- Drop and re-create the database schema on startup -->
<property name="hbm2ddl.auto">create</property> <!-- <mapping resource="cn/happy/entity/Student.hbm.xml" /> -->
<!-- <mapping resource="cn/happy/entity/grade.hbm.xml" /> -->
<!-- <mapping class="cn.happy.entity.Grade"/> -->
<!-- <mapping resource="cn/happy/entity/Dept.hbm.xml" />
<mapping resource="cn/happy/entity/Emp.hbm.xml" /> -->
<!-- <mapping resource="cn/happy/entity/Employee.hbm.xml" />
<mapping resource="cn/happy/entity/Project.hbm.xml" /> --> <mapping resource="cn/happy/entitys/Employee.hbm.xml" />
<mapping resource="cn/happy/entitys/Project.hbm.xml" />
<mapping resource="cn/happy/entitys/ProEmp.hbm.xml" /> </session-factory> </hibernate-configuration>

Hinernate.hbm.xml

 package cn.happy.ui;

 import org.hibernate.Session;
import org.hibernate.Transaction; import cn.happy.entitys.Employee;
import cn.happy.entitys.ProEmp;
import cn.happy.entitys.Project;
import cn.happy.util.HibernateUtil; public class Test4 {
public static void main(String[] args) {
test();
}
public static void test(){
Session session = HibernateUtil.currentSession();
Transaction tx = session.beginTransaction(); Project pro=new Project();
pro.setProname("ADO"); Employee emp=new Employee();
emp.setEmpname("范子阳"); ProEmp proemp=new ProEmp();
proemp.setEmp(emp);
proemp.setPro(pro); session.save(proemp);
session.save(emp);
session.save(pro); tx.commit();
HibernateUtil.closeSession();
} }

测试类

Hibernate中双向多对多的两种配置方式的更多相关文章

  1. hibernate 一对一 one to one的两种配置方式

    hibernate中one-to-one两种配置方式 标签: hibernateHibernateone-to-one 2013-02-19 17:44 11445人阅读 评论(1) 收藏 举报  分 ...

  2. IOC容器在web容器中初始化——(一)两种配置方式

    参考文章http://blog.csdn.net/liuganggao/article/details/44083817,http://blog.csdn.net/u013185616/article ...

  3. Ajax中的get和post两种请求方式的异同

    Ajax中我们经常用到get和post请求.那么什么时候用get请求,什么时候用post方式请求呢? 在做回答前我们首先要了解get和post的区别.   1. get是把参数数据队列加到提交表单的A ...

  4. MyBatis中主键回填的两种实现方式

    主键回填其实是一个非常常见的需求,特别是在数据添加的过程中,我们经常需要添加完数据之后,需要获取刚刚添加的数据 id,无论是 Jdbc 还是各种各样的数据库框架都对此提供了相关的支持,本文我就来和和大 ...

  5. 转:Ajax中的get和post两种请求方式的异同

    1. get是把参数数据队列加到提交表单的ACTION属性所指的URL中,值和表单内各个字段一一对应,在URL中可以看到.post是通过HTTP post机制,将表单内各个字段与其内容放置在HTML ...

  6. C#中迭代器的概念和两种实现方式

    1.首先我们看下IEnumerable接口定义:   namespace System.Collections    {        // Summary:        //     Expose ...

  7. 在k8s中部署前后端分离项目进行访问的两种配置方式

    第一种方式 (1) nginx配置中只写前端项目的/根路径配置 前端项目使用的Dockerfile文件内容 把前端项目编译后生成的dist文件夹放在nginx的html默认目录下,浏览器访问前端项目时 ...

  8. 第四节:框架前期准备篇之进程外Session的两种配置方式

    一. 基本介绍 1. 背景:Asp.Net默认的Session机制是进程内,存储在服务器端内存中,有这么几个缺点: ①:既然存在内存中,空间有限,不能存储大数据量信息,数据量多的话Session会被挤 ...

  9. springboot之jackson的两种配置方式

    springboot 针对jackson是自动化配置的,如果需要修改,有两种方式: 方式一:通过application.yml 配置属性说明:## spring.jackson.date-format ...

随机推荐

  1. 从coding.net 克隆(git clone)项目代码到本地报无权限(403)错误 解决方案

    直接从coding.net (git clone)项目代码到本地时,会提示没有权限的错误,如下图: 解决方案:添加远程地址的时候带上用户名及密码即可解决,格式如下: git clone http:// ...

  2. 生产-消费模式的synchronized和lock实现(十)

    lock: package com.net.thread.lock; import java.util.concurrent.locks.Condition; import java.util.con ...

  3. 使用union all 命令之后如何对hive表格进行去重

    业务场景大概是这样的,这里由两个hive表格,tableA 和 tableB, 格式内容都是这样的: uid cate1 cate2 在hive QL中,我们知道union有着自动去重的功能,但是那是 ...

  4. 包围轮廓的矩形边界 opencv

    #include<opencv2/opencv.hpp> #include<iostream> using namespace std; using namespace cv; ...

  5. HyperLedger Fabric 1.4 比特币历史(1.1)

    比特币是一种数字货币,也是一种创新思维,把人们带入到一个无中心化.完全可信任.安全可靠的全新思维领域:一个叫“中本聪”的人或组织,使我们思维产生化学反应,他在2008年10月31日发表了比特币白皮书& ...

  6. ST表学习

    啊谈不上学习了.复习一下原理留一下板子. $f\left[i,j \right]$表示以$i$为起点,区间长度为${2}^{j}$的区间最值.以最小值为例,即 $min\left(a\left [ k ...

  7. [Jenkins]持续集成环境下fingbug插件的安装使用与配置

    参考:https://wiki.jenkins.io/display/JENKINS/FindBugs+Plugin 突然,天降杂事.我是想安安静静的做个美丽的测试...但是事与愿违,项目经理叫我帮忙 ...

  8. 6.bootstrap 将文本内容关联一个动作(手机端导航适配)&在超小尺寸下显示,屏幕变大后消失

    1.情景:这是出现在手机端导航适配的,点击文本MENU可以出现下拉的list 解决方法: 1.首先要想到,MENU只有两个状态,因此可以用checkbox实现 2.将MENU放在label标签里面,l ...

  9. 斐波那契数列(递归)&求100以内的素数

    Java 5 添加了 java.util.Scanner 类,这是一个用于扫描输入文本的新的实用程序.它是以 前的 StringTokenizer 和 Matcher 类之间的某种结合.由于任何数据都 ...

  10. 《Cracking the Coding Interview》——第17章:普通题——题目8

    2014-04-28 23:35 题目:最大子数组和问题. 解法:O(n)解法. 代码: // 17.8 Find the consecutive subarray with maximum sum ...