Hibernate的双向多对多关联有两种配置方法:那我们就来看看两种方案是如何配置的。

 一、创建以各自类为类型的集合来关联

1.首先我们要在两个实体类(雇员<Emploee>、工程<Project>)中各自给对方添加一个对方的集合

1.1 雇员实体类

package cn.manytomany.one;

import java.util.HashSet;
import java.util.Set; public class Emploee {
//雇员id
private Integer empId;
//工程
private String empName;
//工程的集合
private Set<Project> projects=new HashSet<Project>(); public Set<Project> getProjects() {
return projects;
}
public void setProjects(Set<Project> projects) {
this.projects = projects;
}
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;
}
}

1.2 工程实体类

package cn.manytomany.one;

import java.util.HashSet;
import java.util.Set; public class Project {
private Integer proId;
private String proName;
private Set<Emploee> emploees=new HashSet<Emploee>(); public Set<Emploee> getEmploees() {
return emploees;
}
public void setEmploees(Set<Emploee> emploees) {
this.emploees = emploees;
}
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;
} }

2.有了实体类之后呢,我们就能通过实体的属性和数据库的表字段配置映射关系。

2.1 emploees.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.manytomany.one">
<class name="Emploee" table="Emploee">
<id name="empId">
<generator class="sequence">
<param name="sequence">SQU_NUM</param>
</generator>
</id>
<property name="empName"></property>
<set name="projects" table="PROEMP">
<key column="RPROID"></key>
<many-to-many class="Project" column="REMPID">
</many-to-many>
</set>
</class>
</hibernate-mapping>

2.2   projects.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.manytomany.one">
<class name="Project" table="PROJECT">
<id name="proId">
<generator class="sequence">
<param name="sequence">SQU_NUM</param>
</generator>
</id>
<property name="proName"></property> <set name="emploees" table="PROEMP" cascade="save-update">
<key column="REMPID"></key>
<many-to-many class="Emploee" column="RPROID">
</many-to-many>
</set>
</class>
</hibernate-mapping>

2.3 另外还有一个最重要的大配置来引用两个小配置

<?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">happy</property>
<property name="connection.password">1</property> <!-- SQL dialect 方言-->
<property name="dialect">
org.hibernate.dialect.Oracle10gDialect
</property> <!-- Disable the second-level cache 二级缓存-->
<!--<property name="cache.provider_class">org.hibernate.cache.NoCacheProvider</property>--> <!-- Echo all executed SQL to stdout 是否在控制台显示sql语句-->
<property name="show_sql">true</property> <!-- 格式化显示SQL -->
<property name="format_sql">true</property> <!-- Drop and re-create the database schema on startup -->
<property name="hbm2ddl.auto">create</property> <!-- 关联小配置 -->
<mapping resource="cn/manytomany/doubleanother/emploees.hbm.xml" />
<mapping resource="cn/manytomany/doubleanother/projects.hbm.xml" />
</session-factory>
</hibernate-configuration>

3.最后就是测试类了

package cn.manytomany.one;

import org.hibernate.Session;
import org.hibernate.Transaction; public class ManyToManyDoubleTest { /**
* 多对多的双向关联测试
*/
public static void main(String[] args) {
Session session = HibernateUtil.currentSession();
Transaction tsc = session.beginTransaction();
//创建雇员
Emploee emp=new Emploee();
emp.setEmpName("田超");
Emploee emp1=new Emploee();
emp1.setEmpName("施强"); //创建工程
Project pro=new Project();
pro.setProName("开发工程");
pro.getEmploees().add(emp);
pro.getEmploees().add(emp1);
try {
session.save(pro);
tsc.commit();
} catch (Exception e) {
// 回滚
tsc.rollback();
}
HibernateUtil.closeSession();
} }

3.1 最后补充一下工具类,看看就行

package cn.manytomany.one;

import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import org.hibernate.Session;
/*
* session工具类
*/
public class HibernateUtil { private static final ThreadLocal<Session> sessionTL=new ThreadLocal<Session>();
private static Configuration cfg;
private static final SessionFactory sf;
static{
try {
cfg=new Configuration().configure();
sf = cfg.buildSessionFactory();
} catch (Exception e) {
//异常
e.printStackTrace();
throw new ExceptionInInitializerError(e);
}
}
public static Session currentSession(){
Session session=sessionTL.get();
//如果session为null,则打开一个新的session
if (session==null) {
session=sf.openSession();
sessionTL.set(session);
}
return session;
}
public static void closeSession(){
Session session=sessionTL.get();
sessionTL.set(null);
session.close(); } }

二、创建一个中间的实体类来关联

1.跟第一个方案差不多,先实现三个实体类,代码如下:

package cn.manytomany.doubleanother;

import java.util.HashSet;
import java.util.Set; public class Emploee { private Integer empId;
private String empName;
private Set<ProEmp> proemp=new HashSet<ProEmp>(); //集合的类型为中间的实体类类型
public Set<ProEmp> getProemp() {
return proemp;
}
public void setProemp(Set<ProEmp> proemp) {
this.proemp = proemp;
}
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;
} }
package cn.manytomany.doubleanother;

import java.util.HashSet;
import java.util.Set; public class Project {
private Integer proId;
private String proName;
   //集合的类型依然为中间的实体类类型
private Set<ProEmp> proemp=new HashSet<ProEmp>();

public Set<ProEmp> getProemp() {
     return proemp;
   }
    public void setProemp(Set<ProEmp> proemp) {
     this.proemp = proemp;
   }
   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;
   }

}


1.1  补充的中间实体类

package cn.manytomany.doubleanother;

public class ProEmp {

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

2. 接下来就是小配置了,跟第一个方案格式几乎是一样的,就不过多解释了,直接来看小配置就行了。

因为我们要用中间实体类来关联,所以雇员类(Emploee)和工程类(Project)没有什么眼添加的,只需按照正常的配置即可。

2.1 emploees.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.manytomany.doubleanother">
<class name="Emploee" table="Emploee">
<id name="empId">
<generator class="sequence">
<param name="sequence">SQU_NUM</param>
</generator>
</id>
<property name="empName"></property>
</class>
</hibernate-mapping>

2.2  emploees.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.manytomany.doubleanother">
<class name="Project" table="PROJECT">
<id name="proId">
<generator class="sequence">
<param name="sequence">SQU_NUM</param>
</generator>
</id>
<property name="proName"></property>
</class>
</hibernate-mapping>

2.3 关键就在于 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.manytomany.doubleanother">
<class name="ProEmp" table="PROEMPNEW">
<id name="id">
<generator class="sequence">
<param name="sequence">SQU_NUM</param>
</generator>
</id>
<many-to-one name="emp" class="Emploee" column="EMPID">
</many-to-one>
<many-to-one name="pro" class="Project" column="PROID">
</many-to-one>

</class>
</hibernate-mapping>

3. 现在就可以进行测试类测试数据了

package cn.manytomany.doubleanother;

import org.hibernate.Session;
import org.hibernate.Transaction; import cn.manytomany.one.HibernateUtil; public class ManyToManyDoubleOnlyAnother { /**
* 多对多双向关联---两个多对一关联
*/
public static void main(String[] args) {
Session session = HibernateUtil.currentSession();
Transaction tsc = session.beginTransaction();
//创建雇员
Emploee emp=new Emploee();
emp.setEmpName("田超"); //创建工程
Project pro=new Project();
pro.setProName("开发工程"); //中间类
ProEmp proemp=new ProEmp();
proemp.setEmp(emp);
proemp.setPro(pro);
try {
//保存
session.save(emp);
session.save(pro);
session.save(proemp);
tsc.commit();
} catch (Exception e) {
// 回滚
tsc.rollback();
}
HibernateUtil.closeSession(); } }

好了, Hibernate的多对多双向关联的两种方案已经完成,如果觉得对你们有用的话,记得点个关注啊!!!

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

  1. hibernate多对一双向关联

    关联是类(类的实例)之间的关系,表示有意义和值得关注的连接. 本系列将介绍Hibernate中主要的几种关联映射 Hibernate一对一主键单向关联Hibernate一对一主键双向关联Hiberna ...

  2. Java进阶知识12 Hibernate多对多双向关联(Annotation+XML实现)

    1.Annotation 注解版 1.1.应用场景(Student-Teacher):当学生知道有哪些老师教,老师也知道自己教哪些学生时,可用双向关联 1.2.创建Teacher类和Student类 ...

  3. Hibernate多对多双向关联

    以Student和Course为例,一个学生可以选多门课程,一门课程也可以被多个学生选取: 持久化类Student: package bean; import java.util.Set; publi ...

  4. Hibernate多对多双向关联需要注意的问题(实例说话)

    以Student和Course为例,一个学生可以选多门课程,一门课程也可以被多个学生选取: 持久化类Student: package bean; import java.util.Set; publi ...

  5. Hibernate的many-to-many双向关联的配置办法

    <?xml version="1.0"?><!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibern ...

  6. hibernate 多对多双向关联

    package com.bjsxt.hibernate; import java.util.HashSet; import java.util.Set; import javax.persistenc ...

  7. Java进阶知识10 Hibernate一对多_多对一双向关联(Annotation+XML实现)

    本文知识点(目录): 1.Annotation 注解版(只是测试建表)    2.XML版 的实现(只是测试建表)    3.附录(Annotation 注解版CRUD操作)[注解版有个问题:插入值时 ...

  8. hibernate多对一单向关联

    关联是类(类的实例)之间的关系,表示有意义和值得关注的连接. 本系列将介绍Hibernate中主要的几种关联映射 Hibernate一对一主键单向关联Hibernate一对一主键双向关联Hiberna ...

  9. Java进阶知识11 Hibernate多对多单向关联(Annotation+XML实现)

    1.Annotation 注解版 1.1.应用场景(Student-Teacher):当学生知道有哪些老师教,但是老师不知道自己教哪些学生时,可用单向关联 1.2.创建Teacher类和Student ...

随机推荐

  1. php备份mysql的代码

    1. mydb.php //DB类2. backup.php //备份脚本3. restore.php //还原脚本 mydb.php <?class db{ var $linkid;var $ ...

  2. 中国知网cnki(永久会员账号)

    中国知网cnki(永久会员账号)大男孩免费分享   网站简介: (中国知网http://www.cnki.net/)中国知网是国家知识基础设施(National Knowledge Infrastru ...

  3. spring mvc <mvc:annotation-driven/> 自定义拦截器不走

    <mvc:annotation-driven/> 这个便签会注册2个自定义拦截器,所以导致请求过来就会自己去走注册的这2个拦截器和定义的一堆bean 但是这个便签是必须得定义的 直接贴代码 ...

  4. ios语音识别

    p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 13.0px Menlo; color: #000000; min-height: 15.0px } p.p ...

  5. C++开始前篇,深入编译链接(补充1)

    针对这些问题,这次做一个补充: 一,可重定位文件的格式是什么,以main.o为例, 格式为ELF ,包括:{1,ELF Header 它描述了整个文件的文件属性,包括文件是否可以执行,是静态链接还是动 ...

  6. Linux Yum 安装JDK

    1.查看CentOS自带JDK是否已安装. 输入:yum list installed |grep java. 2.若有自带安装的JDK,如何卸载CentOS系统自带Java环境? 卸载JDK相关文件 ...

  7. 谈谈SQL 语句的优化技术

    https://blogs.msdn.microsoft.com/apgcdsd/2011/01/10/sql-1/ 一.引言 一个凸现在很多开发者或数据库管理员面前的问题是数据库系统的性能问题.性能 ...

  8. asterisk 通话噪音,自动挂断,回声等情况

    打开配置文件:cd /etc/asterisk/ vim chan_dahdi.conf 1: busydetect:忙音检测,如果开启,Asterisk会拨号尝试或通话中分析在线的音频,从而尝试识别 ...

  9. 【Mybatis架构】Mapper映射文件中的#{}与${}

    前言 还记得当初从北京回来的时候,跟着倪文杰师姐做JavaITOO的一卡通模块,我亲姐贾梦洁带着我一块做,期间,我遇到了一个特别奇葩的问题,就死我要实现Mybatis的模糊查询,根据当时亲姐教给我方法 ...

  10. html学习第二天—— 第九、十章——CSS的继承、层叠和特殊性+CSS格式化排版

    继承CSS的某些样式是具有继承性的,那么什么是继承呢?继承是一种规则,它允许样式不仅应用于某个特定html标签元素,而且应用于其后代.比如下面代码:如某种颜色应用于p标签,这个颜色设置不仅应用p标签, ...