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

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

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. client怎样调用IBinder接口对象

    代码: public void funclick(View view){ Intent _intent = new Intent(MainActivity.this,MyService.class); ...

  2. https://github.com/wytings

    博客中写了很多比较杂乱的东西,有时候可能一时看不出效果,毕竟代码问题确实是 “Talk is cheap. Show me the code” 所以,就开了一个github,把一些日常开发和使用的工具 ...

  3. sscanf %*s

    一次在源码里看到 %*s 的格式,从未见过百思不得其解,今天用google的code搜索,搜到一些使用范例,猜测%*s 是说这里有一些字符,长度不一定,按正则表达式的习惯,*代办任意非负整数.例如: ...

  4. cocos2d-x游戏开发 跑酷(八) 对象管理 碰撞检測

    对象管理类的原理是这种: ObjectManager类是一个单例类,全局仅仅有一个对象实例存在.初始化的时候创建两个数组CCArray来保存金币和岩石.为什么要保存,由于在地图重载的时候.要销毁看不见 ...

  5. flex 无法将“<mx:>”解析为组件执行.解决方法

    转自:http://www.myexception.cn/flex/434924.html 问题描述: flex项目导入早期版本 无法将“<mx:******>”解析为组件执行. 如图: ...

  6. VS中的代码拖放

    平时数据操作中,我们经常在选择文件,由于数据太多.数据目录太深,选择数据文件到TextBox中非常不方便,于是就想让控件支持拖放数据,很多软件都支持这个功能,非常实用. 在ArcGIS10.x开发平台 ...

  7. TCP/IP编程 - 1) 基础知识

    1. What Is a Socket?(什么是套接字) A socket is an abstraction through which an application may send and re ...

  8. HDU1004——Let the Balloon Rise

    Problem Description Contest time again! How excited it is to see balloons floating around. But to te ...

  9. android 利用cmdline,将參数从preloader传递到kernel

    以定义參数 cus_param 为例.int型变量. 1. Preloader部分 Platform.h(mediatek\platform\[$platform]\preloader\src\dri ...

  10. unix 网络编程第八章 UDP

    code 见 https://github.com/juniperdiego/Unix-network-programming-of-mine/tree/master/udpserv01 1 建立so ...