Hibernate双向多对多对象关系模型映射

1 双向many-to-many

业务模型:

描述员工和项目

一个员工同时可以参与多个项目

一个项目中可以包含多个员工

分析:数据库的数据模型,通过中间关系表,建立两个one-to-many构成many-to-many

 1 create table emp
 2 (
 3     eno int primary key auto_increment,
 4     ename varchar
 5 );
 6 create table project
 7 (
 8     pid int primary key auto_increment,
 9     pname varchar,
10 );
11 create table relationship
12 (
13     eno int,
14     pid int,
15 );

1.1 描述java的数据模型

1.2进行pojo的映射配置

1.3加载配置文件产生数据库模型

在数据库为两个主外键。

1.4进行CRUD操作

1.4.1 添加员工信息

 1 @Test
 2 public void testSaveEmp()
 3 {
 4     Session session = HibernateSessionFactory.getSession();
 5     //开启事务
 6     Transaction tr = session.beginTransaction();
 7     //创建员工对象
 8     Emp emp = new Emp();
 9     emp.setEname("毛主席");
10     session.save(emp);
11     tr.commit();
12     session.close();
13 }

1.4.2添加项目信息

 1 @Test
 2 public void testSaveProject()
 3 {
 4     Session session = HibernateSessionFactory.getSession();
 5     //开启事务
 6     Transaction tr = session.beginTransaction();
 7     //创建员工对象
 8     Project p = new Project();
 9     p.setPname("渡江战役");
10     session.save(p);
11     tr.commit();
12     session.close();
13 }

1.4.3添加项目同时分配员工

新添加项目,将项目分配给已经存在的员工

 1 /**
 2  * 添加项目数据,分配已有员工
 3  * ****/
 4 @Test
 5 public void saveProjectEmp()
 6 {
 7     //获得Session
 8     Session session=sf.openSession();
 9     //开启事务
10     Transaction tr=session.beginTransaction();
11     //创建项目对象
12     Project p= new Project();
13     p.setPname("CRM");
14     //查询员工的对象
15     List<Emp> elist = session.createCriteria(Emp.class).list();
16     //将员工分配给新项目:给中间表插入数据
17     p.setEmps(new HashSet(elist));
18     session.save(p);
19     //提交事务
20     tr.commit();
21     //释放资源
22     session.close();
23 }

1.4.4解除员工和项目的关系

通过员工解除关系的。

 1 /***
 2  * 解除员工和项目的关系
 3  * 删除中间表中的数据
 4  * ***/
 5 @Test
 6 public void deleteProjectEmp()
 7 {
 8     //获得Session
 9     Session session=sf.openSession();
10     //开启事务
11     Transaction tr=session.beginTransaction();
12     //查询员工对象
13     Emp emp = (Emp) session.get(Emp.class, 1);
14     //获得员工参与的所有项目
15     Set<Project> pros=emp.getPros();
16     System.out.println(pros);
17     //查询项目对象
18     Project p=(Project) session.get(Project.class,3);
19     System.out.println(p);
20     /****
21      *
22      * set集合中元素的地址和单条查询获得项目对象的地址一样,所有set集合中的项目对象和
23      * 单条查询获得的项目对象,是同一个对象,所以pros.remove(p),删除了集合中地址和p一样的对象
24      *
25      * *****/
26     //p.equals(obj);
27     //从pros中删除某个项目
28     /***
29      * 现在关系是由员工断开(默认inverse=false)
30      * many-to-many这种情况:保存其中一方的inverse=true
31      * ***/
32     pros.remove(p);//
33     //提交事务
34     tr.commit();
35     //释放资源
36     session.close();
37 }
时间: 2024-11-10 15:45:04

Hibernate双向多对多对象关系模型映射的相关文章

关联映射 ---- Hibernate之多对多关系

叙:上一章详细的记录了关联映射中的"一对多|多对一"关系.级联操作.关系的维护等知识点,本章节轻风学习记录的是级联关系中的"多对多"关系: Hibernate的"多对多"级联关系 1. 介绍 在生活中很多关系都是多对多的,比如一个人在公司是技术部的同时也是营销部的(只是个例子),所以,多对对关系是很普遍的,一个对象有多个角色,而一个角色又可以有多个对象,因此最正确的做法是在对象与角色之间创建一个新的表,用来保存对象和角色的主键,方便调用查看相应的

Flask框架之多对多关系模型类的定义

案例代码: table_relation = db.Table('stu_tea_rel', # 关系表明 db.Column('stu_id', db.Integer, db.ForeignKey('student.id')), # 多关系表的主键 db.Column('tea_id', db.Integer, db.ForeignKey('teacher.id'))) # 多关系表的主键 class Student(db.Model): id = db.Column(db.Integer,

--------Hibernate框架之双向多对多关系映射

今天跟大家分享下在Hibernate中双向的多对多的映射关系 这次我们以项目和员工举个栗子,因为大家可以想象得到,在真实的环境下,一个项目肯定是对应着多个员工的,这毫无疑问, 那么同时,一个比较牛员工也能同时参与多个项目的开发,这就体现了双向多对多的关系. 首先呢,我们得弄清楚在底层数据库中表与表之间的关系,我们创建一个员工表(Employee)和项目表(Project)毫无疑问,那么我们要怎么体现出多对多的关系呢? 当然有很多种方法,这里我以单独提出一张关系表为例,也就是说,我单独创建一张表来

Hibernate 双向 多对一

双向多对一和单向多对一唯一不同的地方是多对一的一那端增加了到多那端的映射关联,参照模型还是顾客(customer)-订单(order) package com.demo.model.many2one.both; import java.util.HashSet; import java.util.Set; public class Customer { private Integer id; private String name; private Set<Order> orders = ne

Hibernate中多对多关系转换

问题来源 在运用SSH架构开发Web应用时,总会遇到表之间一对多.多对一.多对多等等的关系,而对于多对多的关系,在操作和性能方面都不太理想,所以多对多的映射使用较少,实际使用中最好转换成一对多的对象模型:hibernate会为我们创建中间关联表,转换成两个一对多. 问题解决 在此用开发OA项目时角色表和权限之间的多对多关系提供解决问题的建议 例子:角色与权限 (1)先看需求 (2)分析 第一,角色与权限:多对多 一个角色可以有多个权限,一个权限可以被多个角色使用 第二,在角色的增删改查中涉及到了

关于hibernate中多对多关系

关于多对多关系 数据库:在使用多对多的关系时,我们可以使用复合主键.也可以不使用,直接引入外键同样可以实现. 在数据库中使用多对多关系时,需要一个中间表. 多对多关系中的数据库结构如下: 表:Orders 字段:orderid(主键)..... 表:Users 字段:usersid(主键),.... 中间表: cy_order_user 字段:cy_order_user主键id 外键:cy_orderid(引入Orders表) 外键:cy_usersid(引入Users表) 注意:中间表的外键是

jpa双向多对多关系

多对多关系相比其他其中关联关系,显得稍微复杂了一点点,这个复杂度主要体现在对这种关联关系的理解上.和其他关联关系不同的是这种关联多出来了一张中间表,操作上多了些许复杂,来随便看下吧 1  实体的定义 Student表: package org.lxh.info; import java.util.*; import javax.persistence.CascadeType; import javax.persistence.Column; import javax.persistence.En

Hibernate双向多对多关联

一.配置双向多对多关联 以Project类(项目)和Emp类(员工)为例: 1.创建Project类,并需要定义集合类型的Emp属性 public class Project { //编号 private Integer pid; //名称 private String pname; //定义集合类型的Emp属性 private Set<Emp> emps=new HashSet<Emp>(); public Integer getPid() { return pid; } pub

hibernate基于主键的双向多对多的关联映射

1.类Role 和Function类 Fole: public class Role { private int id; private String name; private Set<Function> functions = new HashSet<Function>(0); //get-set } Function: public class Function { private int id; private String name; private String cod