hibernate07--关联映射
单向的一对多关联
创建对应的实体类以及映射文件
package cn.bdqn.bean;
/**
*
* @author 小豆腐
*街道对应的实体类
*
*单向的多对一关联
*/
public class Street { private Integer id;
private String name;
//多个街道 属于 一个区县
private District district; //对应的区县 public District getDistrict() {
return district;
}
public void setDistrict(District district) {
this.district = district;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Street(Integer id, String name) {
super();
this.id = id;
this.name = name;
}
public Street() {
super();
}
@Override
public String toString() {
return "Street [id=" + id + ", name=" + name + "]";
} }
<?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.bdqn.bean">
<class name="Street">
<id name="id">
<generator class="assigned"/><!-- 手动给主键赋值 -->
</id>
<property name="name"/>
<!-- 配置多对一关联
name:对应的是 本类中 关联关系的属性名
column:对应数据库中 两个表的 外键!
class:关联的实体类-->
<many-to-one name="district" column="districtId" class="District"/>
</class>
</hibernate-mapping>
package cn.bdqn.bean;
/**
* @author 小豆腐
*
*区县的实体类
*/
public class District { private Integer id;
private String name; public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public District(Integer id, String name) {
super();
this.id = id;
this.name = name;
}
public District() {
super();
}
@Override
public String toString() {
return "Street [id=" + id + ", name=" + name + "]";
} }
<?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.bdqn.bean">
<class name="District">
<id name="id">
<generator class="assigned"/><!-- 手动给主键赋值 -->
</id>
<property name="name"/>
</class>
</hibernate-mapping>
需要在hibernate.cfg.xml文件中 配置映射文件
测试类
Session session=null;
Transaction transaction=null; //获取session 开启事务
@Before
public void before(){
session=HibernateSessionUtil.getCurrentSession();
transaction= session.beginTransaction();
} /**
* 测试单向的多对一的关联
*
* 创建对应的区县 新增几个区县 以备后续使用
*/
@Test
public void testAdd(){
District district=new District(3, "区县3");
session.save(district); //保存
transaction.commit(); //提交事务
} //新增 街道的同时 给街道对应的区县赋值
@Test
public void test01(){
//创建一个街道
Street street=new Street();
street.setId(1);
street.setName("街道1");
//给对应的区县赋值
District district= (District) session.load(District.class, 1);
street.setDistrict(district);
session.save(street); //保存
transaction.commit(); //提交事务 只会产生一条sql insert
} //修改 街道对应的区县
@Test
public void test02(){
//从数据库中获取一个街道
Street street=(Street) session.load(Street.class, 1); // 对应的区县是1
District district=(District) session.load(District.class, 2); // 区县是2
//修改
street.setDistrict(district); // 不需要 update 因为两个对象都是持久化对象
//提交事务
transaction.commit();
} //删除 街道对应的区县
@Test
public void test03(){
//从数据库中获取一个街道
Street street=(Street) session.load(Street.class, 1); // 对应的区县是2
//修改
street.setDistrict(null);
//提交事务
transaction.commit();
}
双向的一对多关联就是在单向多对一的基础上增加一个单向的一对多!
修改District代码 一对多关联
package cn.bdqn.bean; import java.util.ArrayList;
import java.util.List; /**
* @author 小豆腐
*
*区县的实体类
* 一对多的关联关系
*/
public class District { private Integer id;
private String name;
// 一个区县 有 多个街道
private List<Street> streets=new ArrayList<>(); public List<Street> getStreets() {
return streets;
}
public void setStreets(List<Street> streets) {
this.streets = streets;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public District(Integer id, String name) {
super();
this.id = id;
this.name = name;
}
public District() {
super();
}
@Override
public String toString() {
//如果写成streets 会出现 堆栈溢出的异常!
return "District [id=" + id + ", name=" + name + ", streets=" + streets.size()
+ "]";
} }
修改District.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="cn.bdqn.bean">
<class name="District">
<id name="id">
<generator class="assigned"/><!-- 手动给主键赋值 -->
</id>
<property name="name"/>
<!-- 设置一对多
name:本类中的关联属性名 集合的名称
column: 就是数据库表中的外键
order-by="id desc" 按照 街道的id 进行 降序排列
inverse:是由谁来维护表与表之间的关系! 默认是false!(维护) true(不维护)
-->
<bag name="streets" cascade="all" inverse="true">
<key column="districtId"/>
<one-to-many class="Street"/>
</bag>
</class>
</hibernate-mapping>
在测试类中增加代码
/**
* 创建几个街道 测试 双向的一对多关联
*/
@Test
public void test04(){
Street street=new Street();
street.setId(4);
street.setName("街道4");
//给对应的区县赋值
District district= (District) session.load(District.class, 1);
street.setDistrict(district);
session.save(street); //保存
//提交事务
transaction.commit();
} //根据区县 获取所管辖的街道
@Test
public void test05(){
District district=(District) session.load(District.class, 1);
List<Street> streets = district.getStreets();
for (Street street : streets) {
System.out.println(street);
}
}
/**
* 根据区县 获取所管辖的街道 根据街道的编号 降序排列
* 01.只需要在 bag节点中 增加 order-by属性 = id desc
*/
@Test
public void test06(){
District district=(District) session.load(District.class, 1);
List<Street> streets = district.getStreets();
for (Street street : streets) {
System.out.println(street);
}
}
/**
* 02.使用hql语句
*/
@Test
public void test07(){
String hql="from Street s where districtId=:id order by s.id desc";
//创建query对象
Query query = session.createQuery(hql);
//给参数赋值
query.setParameter("id", 1); //区县编号是1
//遍历结果集
List<Street> list = query.list();
for (Street street : list) {
System.out.println(street);
}
} /**
* cascade属性:定义的是关系两端 对象到对象的级联关系!
* 必须是 双向的一对多关联!
*
* 常用的属性值:
* 01.none:默认值!当session操作当前对象的时候,忽略关联的属性!
* 02.save-update:当session调用save,saveorUpdate以及update()的时候!
* 会级联的保存和修改当前对象以及对象关联的属性!
* 001.去区县的xml文件中 的 bag节点 增加 cascade属性!
* 002.直接运行以下代码
* 03.delete: 当session调用 delete()的时候,会级联删除所关联的对象 !
* 04.all: 包括了save-update和delete!
*
* 添加区县的同时 添加街道
*/
@Test
public void test08(){
//创建区县
District district=new District(4, "区县4");
//创建街道
Street street1=new Street(5, "街道5");
Street street2=new Street(6, "街道6");
Street street3=new Street(7, "街道7");
//给区县的街道赋值
district.getStreets().add(street1);
district.getStreets().add(street2);
district.getStreets().add(street3);
//保存区县
session.save(district); //发现 保存了 区县 但是 没有保存对应的街道!
transaction.commit();
/**
* 程序执行之后的结果:
* Hibernate: insert into District (name, id) values (?, ?)
Hibernate: update Street set districtId=? where id=?
Hibernate: update Street set districtId=? where id=?
Hibernate: update Street set districtId=? where id=?
*/ /**
* 在xml文件中设置了 cascade="save-update" 之后的结果
*
* 问题:虽然级联保存成功了!
* 但是有多余update语句!
* 为什么会出现多余的? 两个对象都在维护彼此之间的关系!
*
* Hibernate: select street_.id, street_.name as name1_, street_.districtId as districtId1_ from Street street_ where street_.id=?
Hibernate: select street_.id, street_.name as name1_, street_.districtId as districtId1_ from Street street_ where street_.id=?
Hibernate: select street_.id, street_.name as name1_, street_.districtId as districtId1_ from Street street_ where street_.id=?
Hibernate: insert into District (name, id) values (?, ?)
Hibernate: insert into Street (name, districtId, id) values (?, ?, ?)
Hibernate: insert into Street (name, districtId, id) values (?, ?, ?)
Hibernate: insert into Street (name, districtId, id) values (?, ?, ?)
Hibernate: update Street set districtId=? where id=?
Hibernate: update Street set districtId=? where id=?
Hibernate: update Street set districtId=? where id=?
*/
} /**
* cascade="delete" xml中的配置
* 删除 区县 的同时 删除 街道!
*/
@Test
public void test09(){
District district= (District) session.load(District.class, 1);
//获取三个街道
Street street1= (Street) session.load(Street.class, 2);
Street street2= (Street) session.load(Street.class, 3);
Street street3= (Street) session.load(Street.class, 4);
session.delete(district);
transaction.commit();
/**
* Hibernate: update Street set districtId=null where districtId=?
Hibernate: delete from Street where id=?
Hibernate: delete from Street where id=?
Hibernate: delete from Street where id=?
Hibernate: delete from District where id=?
*/
} /**
* 针对于 多余的sql语句 解决办法!
*
* 只需要一方来维护表之间的关系!
* inverse属性:
* 01.默认是false(由我维护!)
* 02.inverse=true:这一方不维护关系!(不与数据库交互)
*
*
* 不能都维护,也不能都 不维护! 这个时候关键是谁来维护这个关系?
* 双向的一对多!
* hibernate:规定多的一端来维护关系,那么必须在一的一方设置 inverse=true:
*/
@Test
public void test10(){
//创建区县
District district=new District(4, "区县4");
//创建街道
Street street1=new Street(5, "街道5");
Street street2=new Street(6, "街道6");
Street street3=new Street(7, "街道7");
//给区县的街道赋值
district.getStreets().add(street1);
district.getStreets().add(street2);
district.getStreets().add(street3);
//保存区县
session.save(district); //发现 保存了 区县 但是 没有保存对应的街道!
transaction.commit();
/**
*
* 发现 没有了 update语句!
* Hibernate: select street_.id, street_.name as name1_, street_.districtId as districtId1_ from Street street_ where street_.id=?
Hibernate: select street_.id, street_.name as name1_, street_.districtId as districtId1_ from Street street_ where street_.id=?
Hibernate: select street_.id, street_.name as name1_, street_.districtId as districtId1_ from Street street_ where street_.id=?
Hibernate: insert into District (name, id) values (?, ?)
Hibernate: insert into Street (name, districtId, id) values (?, ?, ?)
Hibernate: insert into Street (name, districtId, id) values (?, ?, ?)
Hibernate: insert into Street (name, districtId, id) values (?, ?, ?)
*/
}
hibernate07--关联映射的更多相关文章
- Hibernatel框架关联映射
Hibernatel框架关联映射 Hibernate程序执行流程: 1.集合映射 需求:网络购物时,用户购买商品,填写地址 每个用户会有不确定的地址数目,或者只有一个或者有很多.这个时候不能把每条地址 ...
- hibernate多对多关联映射
关联是类(类的实例)之间的关系,表示有意义和值得关注的连接. 本系列将介绍Hibernate中主要的几种关联映射 Hibernate一对一主键单向关联Hibernate一对一主键双向关联Hiberna ...
- Hibernate一对多单向(双向)关联映射
(1).编写配置文件 Hibernate通过读写默认的XML配置文件hibernate.cfg.xml加载数据库配置信息.代码如下: <hibernate-configuration> & ...
- Java三大框架之——Hibernate关联映射与级联操作
什么是Hibernate中的关联映射? 简单来说Hibernate是ORM映射的持久层框架,全称是(Object Relational Mapping),即对象关系映射. 它将数据库中的表映射成对应的 ...
- Hibernate关联映射 映射文件的配置
一:多对一单向关联 首先我们必须创建两个实体类 例如:Dept类 public class Dept { private Integer deptNo; private String dName; p ...
- Hibernate组件和关联映射
一.基本定义 组件:建立一个类,为了方便代码复用和建立模型,但类在数据库中并没有对应的表,此类可以作为一个组件插入到其他类中(有数据表的类) 组件和关联映射的关系是组件是没有对应的类;组件是值类型的, ...
- 【Hibernate框架】关联映射(多对多关联映射)
按着我们的总结行进计划,接下来,就是有关于多对多映射的总结了. 我们来举个例子啊,很长时间以来,房价暴涨不落,但是还有很多人拥有很多套房产,假如说,一个富豪拥有九套房产,家里人么准去住哪一套,我们就以 ...
- 【Hibernate框架】关联映射(一对多,多对一)
根据我们的总结计划,上篇文章我们总结了有关于一对一映射相关知识,接下来,我们进行下一个阶段,一对多.多对一映射相关知识. 场景设定: 国家规定,一个人只能在一个公司上班,一个公司可以拥有很多员工.我们 ...
- 【Hibernate框架】关联映射(一对一关联映射)
一.整理思路: 之前,小编总结过Mybatis的关联映射,接下来,再来总结一下hibernate的相关的关联映射,直接上图: 这张图,就是小编整理总结整个Hibernate的关联映射的一个大致思路. ...
- Hibernate注解----关联映射注解以及课程总结详解----图片版本
上一篇,记录了Hibernate注解----类级别注解以及属性注解详解 ,我们这一节主要讲解的是Hibernate注解----关联映射注解以及课程总结详解. 本节的主要内容: 第3章 关联映射注解 3 ...
随机推荐
- 【转】http的keep-alive和tcp的keepalive区别
http://blog.csdn.net/oceanperfect/article/details/51064574 1.HTTP Keep-Alive在http早期,每个http请求都要求打开一个t ...
- Java通过SMS短信平台实现发短信功能
在项目中使用过发短信的功能,但那个由于公司内部的限制很麻烦,今天在网上找到一个简单的,闲来无事就把它记录如下: 本程序是通过使用中国网建提供的SMS短信平台实现的(该平台目前为注册用户提供5条免费短信 ...
- jvm理论-运行时数据区
三大流行jvm sun HotSpot ibm j9 BEA JRockit Oracle 会基于HotSpot整合 JRockit. jvm运行时数据区 java虚拟机所管理的内存将会包括以下几个运 ...
- C# 多线程參数传递
1.通过实体类来传递(能够传递多个參数与获取返回值),demo例如以下: 须要在线程中调用的函数: namespace ThreadParameterDemo { public class Funct ...
- VirtualBox虚拟机磁盘瘦身
操作系统 : windows7_x64 VirtualBox 版本 : 4.3.28 原理: 使用0填充虚拟系统磁盘,然后删除填充文件,再使用VBoxManage进行压缩. Linux系统磁盘瘦身 一 ...
- C# 调用线程并行上下文穿透-ILogicalThreadAffinative+CallContext
na mespace System.Runtime.Remoting.Messaging { /// <summary>Provides a set of properties that ...
- Ubuntu18.04下可以完美运行Quake3 Arena
安装 其实很早就知道Linux下面可以跑Quake3, 但是一直没有付诸行动, 在硬盘上躺了很多年的Quake III Arena, 和Brood一起从来不舍得删, 昨天终于想起来试试. 安装很简单, ...
- Ubuntu18.04下的模拟神器RetroArch
安装 直接通过apt安装 sudo add-apt-repository ppa:libretro/stable sudo apt update sudo apt install retroarch ...
- mac 10.12 sierra 机械键盘+ratm可编程鼠标记录
系统:mac 10.12 sierra 键盘:机械键盘 鼠标:mad catz ratm 在mac 10.11/10.12 之前: 机械键盘:一般的机械键盘在mac上使用, alt 和 win 键 ...
- Python 爬虫实例(7)—— 爬取 新浪军事新闻
我们打开新浪新闻,看到页面如下,首先去爬取一级 url,图片中蓝色圆圈部分 第二zh张图片,显示需要分页, 源代码: # coding:utf-8 import json import redis i ...