多对多关系映射和一对多关系映射开发步骤差不多,

例子如下:员工和项目之间的关系,一个员工可以参与多个项目;一个项目可以有多个开发人员参与。因此是多对多的关系。

1 分析数据表

1.1)员工表

CREATE TABLE employee(
id INT PRIMARY KEY AUTO_INCREMENT,
ename VARCHAR() NOT NULL);

1.2)项目表

CREATE TABLE project(
id INT PRIMARY KEY AUTO_INCREMENT,
pname VARCHAR() NOT NULL,
startDate DATE);

1.3)员工和项目关系表

CREATE TABLE emp_pro_relation(
eid INT,
pid INT,
FOREIGN KEY (eid) REFERENCES employee(id),
FOREIGN KEY (pid) REFERENCES project(id));

2 编写实体类

Employee类

public class Employee {
private int id;
private String ename;
private Set<Project> projects = new HashSet<Project>();
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getEname() {
return ename;
}
public void setEname(String ename) {
this.ename = ename;
}
public Set<Project> getProjects() {
return projects;
}
public void setProjects(Set<Project> projects) {
this.projects = projects;
}
}

Project类

public class Project {
private int id;
private String pname;
private Date startDate = new Date();
private Set<Employee> employees = new HashSet<Employee>();
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getPname() {
return pname;
}
public void setPname(String pname) {
this.pname = pname;
}
public Date getStartDate() {
return startDate;
}
public void setStartDate(Date startDate) {
this.startDate = startDate;
}
public Set<Employee> getEmployees() {
return employees;
}
public void setEmployees(Set<Employee> employees) {
this.employees = employees;
}
}

3 映射配置

Employee.hbm.xml配置

<?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="com.baidu.entity"> <class name="Employee" table="employee">
<id name="id" column="id">
<generator class="native"/>
</id> <property name="ename" column="ename"></property> <set name="projects" table="emp_pro_relation">
<key column="eid"></key>
<many-to-many column="pid" class="Project"></many-to-many>
</set> </class> </hibernate-mapping>

Project.hbm.xml配置

<?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="com.baidu.entity"> <class name="Project" table="project"> <id name="id" column="id">
<generator class="native"/>
</id> <property name="pname" column="pname"></property> <set name="employees" table="emp_pro_relation" cascade="save-update">
<key column="pid"></key>
<many-to-many column="eid" class="Employee"></many-to-many>
</set> </class> </hibernate-mapping>

4 全局配置hibernate.cfg.xml

<hibernate-configuration>
<session-factory>
<!-- 数据库连接配置 -->
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="hibernate.connection.url">jdbc:mysql:///day26?useSSL=true</property>
<property name="hibernate.connection.username">root</property>
<property name="hibernate.connection.password">root</property> <!-- 其他设置 -->
<property name="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</property>
<property name="show_sql">true</property>
<property name="format_sql">true</property> <!-- 映射文件加载 -->
<mapping resource="com/huitong/entity/Project.hbm.xml"/>
<mapping resource="com/huitong/entity/Employee.hbm.xml"/> </session-factory> </hibernate-configuration>

二、简单测试

public void fun1(){
Configuration configuration = new Configuration();
configuration.configure();
SessionFactory sessionFac = configuration.buildSessionFactory();
Session session = sessionFac.openSession();
Transaction bt = session.beginTransaction(); Employee emp1 = new Employee();
emp1.setEname("good1"); Employee emp2 = new Employee();
emp2.setEname("good2"); Employee emp3 = new Employee();
emp3.setEname("nice1"); Employee emp4 = new Employee();
emp4.setEname("nice2"); Project pro1 = new Project();
pro1.setPname("OA"); Project pro2 = new Project();
pro2.setPname("电商"); pro1.getEmployees().add(emp1);
pro1.getEmployees().add(emp2);
pro1.getEmployees().add(emp3); pro2.getEmployees().add(emp3);
pro2.getEmployees().add(emp4); session.save(pro1);
session.save(pro2); bt.commit();
session.close();
sessionFac.close();
}

需要注意的是:在使用一方保存另一方时,可能会有错误。此时需要在保存方配置cascade属性。

hibernate 中多对多关系对象集合的保存的更多相关文章

  1. 如何决解项目中hibernate中多对多关系中对象转换json死循环

    先写一下原因吧!我是写的SSH项目,在项目中我遇到的问题是把分页对象(也就是pageBean对象)转化为json数据,下面为代码: public class PageBean <T>{// ...

  2. 关于hibernate中多对多关系

    关于多对多关系 数据库:在使用多对多的关系时,我们能够使用复合主键.也能够不使用,直接引入外键相同能够实现. 在数据库中使用多对多关系时,须要一个中间表. 多对多关系中的数据库结构例如以下: 表:Or ...

  3. hibernate中对象集合的保存

    一.在java web设计中经常使用对象进行操作,在hibernate中对象集合的保存(一对多) 1需要进行如下步骤: 1) 设计数据表关系 2)引入jar包,需要注意引入数据库connector 3 ...

  4. 2018.11.1 Hibernate中的Mapper关系映射文件

    Customer.hbm.xml 基本的参数都在里面了 <?xml version="1.0" encoding="UTF-8"?> <!DO ...

  5. hibernate中多对多关联

    hibernate中多对多关联 “计应134(实验班) 凌豪” 在关系数据库中有一种常见的关系即多对多关系,例如课程和学生的关系,一个学生可以选择多门课程,同时一门课程也可以被多个学生选择, 因此课程 ...

  6. Hibernate中的映射关系(一对多)

    在数据库中表和表之间的关系有几种,(一对一,一对多,多对多)一对一关系:可以选择任意一方插入外键(one-to-one:one-to-one<--->many-to-one[unique= ...

  7. 【Hibernate】多对多关系的表达

    User.hbm.xml <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE hibernate ...

  8. hibernate中一对多关系中的inverse,cascade属性

    举例说明: 一对多关系的两张表:boy.girl(一个男孩可以多个女朋友) boy表结构 Field   Type        ------  -----------  name    varcha ...

  9. Hibernate中多对多的annotation的写法(中间表可以有多个字段)

    2011-07-04 6:52 一般情况下,多对多的关联关系是需要中间表的: 情况一:如果中间表仅仅是做关联用的,它里面仅有2个外键做联合主键,则使用ManyToMany(不用写中间表的Model,只 ...

随机推荐

  1. 在apache环境中使用 python stock 请求遇到error: [Errno 13] Permission denied

    一个python 项目运行在linux 环境下,使用apache做为web容器. 调用urllib2.urlopen(your url) 或者 xmlrpclib.ServerProxy()请求某个服 ...

  2. 《转》OpenStack Ceilometer 安装配置和API说明

    1.概述 Ceilometer是OpenStack中的一个子项目.它像一个漏斗一样.能把OpenStack内部发生的差点儿全部的事件都收集起来,然后为计费和监控以及其他服务提供数据支撑.Ceilome ...

  3. VS2017安装后如何移动 Windows Kits文件夹

    MS的回答 LINK Try the following technique: Close all programs, move the “Windows Kits” folder to anothe ...

  4. 简单Gif制作

    没什么需求,只是循环图片的推荐:http://gif.55.la/ ,在线制作,无需下载

  5. 显示所有环境变量:env 或者 printenv

    显示所有环境变量:env 或者 printenv

  6. Steve Lin:如何撰写一篇优秀的SIGGRAPH论文

     英文原版 PPT下载:http://vdisk.weibo.com/s/z7VKRh2i3R4YO 一篇优秀的论文应该是这样的 广大的研究同仁介绍了这篇论文所包含的重要想法和所获得的结果 在论文中描 ...

  7. Jedis API 详细示例

    Jedis API 详细示例 https://www.jianshu.com/p/125357ee7651

  8. 分布式系统漫谈一 —— Google三驾马车: GFS,mapreduce,Bigtable

    分布式系统学习必读文章!!!! 原文:http://blog.sina.com.cn/s/blog_4ed630e801000bi3.html 分布式系统漫谈一 —— Google三驾马车: GFS, ...

  9. easyui datagrid 分页保持checkbox选中状态

    刚开始我一直迷迷糊糊的写了很久,发现其实很简单 先给大家看看我的笨办法 var checkedItems = []; function ischeckItem() { for (var i = 0; ...

  10. Android 自己主动化測试(3)&lt;monkeyrunner&gt; 依据ID查找对象&amp;touch&amp;type (python)

    我在之前的两篇文章中用java来实现过 Android 自己主动化測试(1)怎样安装和卸载一个应用(java).Android 自己主动化測试(2)依据ID查找对象(java). 可是本质上都是用mo ...