Hibernate双向多对多对象关系模型映射
1 双向many-to-many
业务模型:
描述员工和项目
一个员工同时可以参与多个项目
一个项目中可以包含多个员工
分析:数据库的数据模型,通过中间关系表,建立两个one-to-many构成many-to-many
create table emp
(
eno int primary key auto_increment,
ename varchar
);
create table project
(
pid int primary key auto_increment,
pname varchar,
);
create table relationship
(
eno int,
pid int,
);
1.1 描述java的数据模型

1.2进行pojo的映射配置

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

在数据库为两个主外键。
1.4进行CRUD操作
1.4.1 添加员工信息
@Test
public void testSaveEmp()
{
Session session = HibernateSessionFactory.getSession();
//开启事务
Transaction tr = session.beginTransaction();
//创建员工对象
Emp emp = new Emp();
emp.setEname("毛主席");
session.save(emp);
tr.commit();
session.close();
}
1.4.2添加项目信息
@Test
public void testSaveProject()
{
Session session = HibernateSessionFactory.getSession();
//开启事务
Transaction tr = session.beginTransaction();
//创建员工对象
Project p = new Project();
p.setPname("渡江战役");
session.save(p);
tr.commit();
session.close();
}
1.4.3添加项目同时分配员工
新添加项目,将项目分配给已经存在的员工
/**
* 添加项目数据,分配已有员工
* ****/
@Test
public void saveProjectEmp()
{
//获得Session
Session session=sf.openSession();
//开启事务
Transaction tr=session.beginTransaction();
//创建项目对象
Project p= new Project();
p.setPname("CRM");
//查询员工的对象
List<Emp> elist = session.createCriteria(Emp.class).list();
//将员工分配给新项目:给中间表插入数据
p.setEmps(new HashSet(elist));
session.save(p);
//提交事务
tr.commit();
//释放资源
session.close();
}
1.4.4解除员工和项目的关系
通过员工解除关系的。
/***
* 解除员工和项目的关系
* 删除中间表中的数据
* ***/
@Test
public void deleteProjectEmp()
{
//获得Session
Session session=sf.openSession();
//开启事务
Transaction tr=session.beginTransaction();
//查询员工对象
Emp emp = (Emp) session.get(Emp.class, 1);
//获得员工参与的所有项目
Set<Project> pros=emp.getPros();
System.out.println(pros);
//查询项目对象
Project p=(Project) session.get(Project.class,3);
System.out.println(p);
/****
*
* set集合中元素的地址和单条查询获得项目对象的地址一样,所有set集合中的项目对象和
* 单条查询获得的项目对象,是同一个对象,所以pros.remove(p),删除了集合中地址和p一样的对象
*
* *****/
//p.equals(obj);
//从pros中删除某个项目
/***
* 现在关系是由员工断开(默认inverse=false)
* many-to-many这种情况:保存其中一方的inverse=true
* ***/
pros.remove(p);//
//提交事务
tr.commit();
//释放资源
session.close();
}
1.4.5 给已有项目分配新员工
/***
* 给已有的项目,分配新的员工(新入职)
* ***/
@Test
public void saveProjectEmp2()
{
//获得Session
Session session=sf.openSession();
//开启事务
Transaction tr=session.beginTransaction();
//start:所有的数据改动都是改动内存中的数据
//获得项目对象
Project p= (Project) session.get(Project.class, 4);
//获得项目的所有员工
Set<Emp> emps=p.getEmps();
//创建新的员工对象
Emp emp= new Emp();
emp.setEname("小强4");
//将emp员工对象,添加某个项目对应的员工集合中
emps.add(emp);
emp.getPros().add(p);//inverse=true;由员工建立和项目的关系
//end:当提交事务的时候,本次数据库操作会话需要结束,hibernate自动检查内存中的数据是否和数据库中的一致
//如果不一致,会将内存中的数据同步到数据
//提交事务
tr.commit();
//释放资源
session.close();
}
1.4.6通过员工查询项目
员工姓名 项目名称
/***
* 查询员工姓名 项目名称
* 关联查询:默认延迟加载
* a b c
* ***/
@Test
public void selectProjectEmp()
{
//获得Session
Session session=sf.openSession();
//查询所有的员工
List<Emp> elist = session.createCriteria(Emp.class).list();
for(Emp e:elist){
//获得员工参与的项目的集合
Set<Project> pros = e.getPros();
for(Project p:pros){
System.out.println(e.getEname()+"\t\t"+p.getPname());
}
}
//释放资源
session.close();
}
1.4.7总结
Cascade:继续有效,很少delete,常用save-update
Inverse:必须由一方这是为true反转
中间关系表:
建立关系:insert
断开关系:delete
Hibernate双向多对多对象关系模型映射的更多相关文章
- Hibernate双向一对多对象关系模型映射
双向one-to-many 描述部门和岗位:一个部门有多个岗位 将单向的one-to-many 和many-to-one合并. 4.1双向的one-to-many数据库模型 create table ...
- Hibernate单向一对多对象关系模型映射
1 hibernate 的对象关系映射 Orm: 类-----表 属性------字段 对象------记录 表:在数据库中存在主外键的关系,反向工厂类是由表生成,在由表生成类的时候,类和类之间存在者 ...
- Hibernate双向一对一对象关系模型映射
一个员工一辆车:one-to-one 实现一:让汽车表中的外键唯一 create table emp ( eid int primary key auto_increment, ename varch ...
- Hibernate 单项多对一的关联映射
在日常开发中会出现很对多对一的情况,本文介绍hibernate中多对一的关联映射. 1.设计表结构 2.创建student对象 3.创建Grade对象 4.写hbm.xml文件 5.生成数据库表 生成 ...
- Hibernate框架之双向多对多关系映射
昨天跟大家分享了Hibernate中单向的一对多.单向多对一.双向一对多的映射关系,今天跟大家分享下在Hibernate中双向的多对多的映射关系 这次我们以项目和员工举个栗子,因为大家可以想象得到,在 ...
- 关于hibernate中多对多关系
关于多对多关系 数据库:在使用多对多的关系时,我们能够使用复合主键.也能够不使用,直接引入外键相同能够实现. 在数据库中使用多对多关系时,须要一个中间表. 多对多关系中的数据库结构例如以下: 表:Or ...
- hibernate 中多对多关系对象集合的保存
多对多关系映射和一对多关系映射开发步骤差不多, 例子如下:员工和项目之间的关系,一个员工可以参与多个项目:一个项目可以有多个开发人员参与.因此是多对多的关系. 1 分析数据表 1.1)员工表 CREA ...
- 如何决解项目中hibernate中多对多关系中对象转换json死循环
先写一下原因吧!我是写的SSH项目,在项目中我遇到的问题是把分页对象(也就是pageBean对象)转化为json数据,下面为代码: public class PageBean <T>{// ...
- Hibernate双向多对多关联
一.配置双向多对多关联 以Project类(项目)和Emp类(员工)为例: 1.创建Project类,并需要定义集合类型的Emp属性 public class Project { //编号 priva ...
随机推荐
- windows下PHP+Mysql+Apache环境搭建
Apache版本:httpd-2.2.22-win32-x86-openssl- 下载地址:http://pan.baidu.com/s/1sjuL4RV PHP版 ...
- UVA1376.Animal Run (最小割转为最短路 && dijkstra)
Animal Run Time Limit:6000MS Memory Limit:0KB 64bit IO Format:%lld & %llu Submit Status ...
- Logistic 回归(sigmoid函数,手机的评价,梯度上升,批处理梯度,随机梯度,从疝气病症预测病马的死亡率
(手机的颜色,大小,用户体验来加权统计总体的值)极大似然估计MLE 1.Logistic回归 Logistic regression (逻辑回归),是一种分类方法,用于二分类问题(即输出只有两种).如 ...
- Spark之命令
Spark之命令 1.spark运行模式有4种: a.local 多有用测试, b. standalone:spark 集群模式,使用spark自己的调度方式. c. Yarn: 对Mapreduce ...
- JQuery data方法的使用-遁地龙卷风
(-1)说明 我用的是chrome49,这个方法涉及到JQuery版本问题,我手里有3.0的,有1.9.1,后面将1.9.1及其以前的称为低版本,3.0称为高版本 测试例子用到的showMessage ...
- HDU 5120 Intersection(2014北京赛区现场赛I题 计算几何)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5120 解题报告:给你两个完全相同的圆环,要你求这两个圆环相交的部分面积是多少? 题意看了好久没懂.圆环 ...
- git 教程(12)--分支管理
分支就是科幻电影里面的平行宇宙,当你正在电脑前努力学习Git的时候,另一个你正在另一个平行宇宙里努力学习SVN. 如果两个平行宇宙互不干扰,那对现在的你也没啥影响.不过,在某个时间点,两个平行宇宙合并 ...
- Bootstrap IIFE
在Bootstrap源码(具体请看<Bootstrap源码解析>)和其他jQuery插件经常看到如下的写法: +function ($) { }(window.jQuery); 这种写法称 ...
- Qt5 任务栏托盘功能实现
23333 有一阵子没写博客了,研究了挺长时间qt,学到任务栏托盘时简直无语,网上找得到的代码大多是废码,Qt5不支持或者本身就有毛病不能实现却被n多人转来转去的,甚是无语. 简单托盘功能以下在Qt5 ...
- zabbix之MySQL数据库的安装
转载自:http://www.ttlsa.com/mysql/install-mysql5_6/ 启动MySQL并制定套接字 mysql -u user -ppassword -S 指定socket路 ...