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. Linux基础知识与命令1(su passwd)

    一.Linux的基本原则 1.linux由一个个目的单一的小程序组成,我们一般需要组合小程序来完成复杂的任务 2.Linux的一切都是文件(文件类似于一棵树,包括外设,接口) 3.Linux尽量避免捕 ...

  2. 17-比赛1 F - 较小元素 Weak in the Middle (set)

    Seg-El has last chance to make the final changes in order to prevent the destruction of Krypton. He ...

  3. 翻译 | 卷积码的维特比(Viterbi)译码

    对维特比译码的接触很早就开始了,也想过要写一篇总结性的文章,但无奈心中一直有几个疑团没能得到合理的解答.比如什么时候开始进行回溯译码比较合适?维特比译码的性能相比分组码等其他编码的译码性能究竟好在哪里 ...

  4. 自定义注解不能拦截controller层

    1,首先在springMVC的配置文件中,webapp/WEB-INF/servlet.xml,加上AOP的相关内容: <beans xmlns="http://www.springf ...

  5. issubclasss/type/isinstance/callable/super

    issubclass() : 方法用于判断第一个参数是否是第二个参数的子子孙孙类. 语法:issubclass(sub, super) 检查sub类是否是 super 类的派生类 class A: p ...

  6. PowerCmd

    今天在手机上看慕课网,看到一个好玩的东西.Powercmd. 一开始的感觉是,妈的,我会cmd命令,为什么要用你的cmd? 后来,用了之后,感觉,嗯,还是Powercmd好用.功能强大. 我们来看看它 ...

  7. 安装macports

    Mac下面除了用dmg.pkg来安装软件外,比较方便的还有用MacPorts来帮助你安装其他应用程序,跟BSD中的ports道理一样.MacPorts就像apt-get.yum一样,可以快速安装些软件 ...

  8. 新工具填补Docker管理空白

    [TechTarget中国原创] 从事容器管理领域的IT运维专家这周需要评估一个新的工具. Docker推出了一款新产品,意在让IT运维人员能够跟上开发人员的脚步,这一产品是Docker Datace ...

  9. window.parent 、window.top及window.self 详解

    在应用有frameset或者iframe的页面时,parent是父窗口,top是最顶级父窗口(有的窗口中套了好几层frameset或者iframe),self是当前窗口. 1. window.self ...

  10. centos6系列问题

    一.NetworkManager启动问题 1.由于以后要支持e1000版虚拟化网卡,所有centos6镜像均按照NetworkManager服务,并设置开机自启动 2.虚机启动时,默认是Network ...