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();}@Overridepublic 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();}@Overridepublic 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  开启事务@Beforepublic  void  before(){session=HibernateSessionUtil.getCurrentSession();transaction= session.beginTransaction();}/*** 测试单向的多对一的关联* * 创建对应的区县    新增几个区县   以备后续使用*/@Testpublic   void   testAdd(){District district=new District(3, "区县3");session.save(district);  //保存transaction.commit();  //提交事务}//新增 街道的同时 给街道对应的区县赋值@Testpublic   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}//修改 街道对应的区县 @Testpublic   void   test02(){//从数据库中获取一个街道Street street=(Street) session.load(Street.class, 1);  // 对应的区县是1District district=(District) session.load(District.class, 2);  // 区县是2//修改street.setDistrict(district);  // 不需要 update  因为两个对象都是持久化对象//提交事务transaction.commit();}//删除 街道对应的区县 @Testpublic   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();}@Overridepublic 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>
复制代码

 

在测试类中增加代码

 

复制代码
    /*** 创建几个街道      测试 双向的一对多关联*/@Testpublic   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();}//根据区县  获取所管辖的街道@Testpublic  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*/@Testpublic  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语句*/@Testpublic  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!* * 添加区县的同时 添加街道*/@Testpublic  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中的配置* 删除 区县 的同时 删除 街道!*/@Testpublic  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:*/@Testpublic  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 (?, ?, ?)*/}

转载于:https://www.cnblogs.com/HHR-SUN/p/7190791.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/416388.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java 常用流_Java流类图结构: 流的概念和作用流是一组有顺序的,有起点和终点的字节集合,是对数据传输的总称或抽象。即数据在两设备间的传输称为流,流的本质是数据传输,根据数...

Java流类图结构&#xff1a;流的概念和作用流是一组有顺序的&#xff0c;有起点和终点的字节集合&#xff0c;是对数据传输的总称或抽象。即数据在两设备间的传输称为流&#xff0c;流的本质是数据传输&#xff0c;根据数据传输特性将流抽象为各种类&#xff0c;方便更直观的进…

Java编写五线谱上的音符_干货| 认识五线谱上的音符!

原标题&#xff1a;干货| 认识五线谱上的音符&#xff01;前几周&#xff0c;给友友们分享了节奏学习小技巧……学的好不好可以自我检测一下&#xff1a;如果你最近说话都是这样&#xff1a;最近 啊 | 本渣 被刷 | 屏 - |大家 都 | 玩起 节奏 |不就 追热 | 点 么 |谁 . 不 | 会…

java实现抽奖游戏_Java实现游戏抽奖算法

常用抽奖算法对比基础的游戏抽奖算法通常要求实现在指定奖品的集合中&#xff0c;每个奖品根据对对应概率进行抽取。个人了解的主要有以下几中抽奖算法&#xff1a;随机数一一对应算法思想这种算法思想最为简单。将n个奖品编号0 - N-1&#xff0c;其中各类奖品的概率通过其数量…

java获取keyvault_ARM Template 结合key vault存储机密信息 (一)

前两篇讲到了terraform&#xff0c;作为跨平台的IAC工具绝对是没话说的&#xff0c;很非常好用&#xff0c;今天再讲回Azure原生的ARM Template&#xff0c;ARM Template好处就是作为微软的亲儿子&#xff0c;兼容性啥的绝对没话说&#xff0c;但是JSON对于非开发者来说实在用着…

从多级延迟触发器到边沿检测

本文记录一下关于延迟触发器链与它的常用用法&#xff08;即边沿检测。多级延迟的触发器应该是比较常用的&#xff0c;当我们需要对信号信号进行延时&#xff0c;这个时候我们就用到了延迟触发器链。下面就来记录一下吧。 一、多级延迟触发器&#xff08;或延迟触发器链&#x…

iOS 11: CORE ML—浅析

本文来自于腾讯Bugly公众号&#xff08;weixinBugly&#xff09;&#xff0c;未经作者同意&#xff0c;请勿转载&#xff0c;原文地址&#xff1a;https://mp.weixin.qq.com/s/OWD5UEiVu5JpYArcd2H9ig 作者&#xff1a;liujizhou 导语&#xff1a;在刚刚过去的WWDC上&#xff0…

angular的uiRouter服务学习(5) --- $state.includes()方法

$state.includes 方法用于判断当前激活状态是否是指定的状态或者是指定状态的子状态. $state.includes(stateOrName,params,options) $state.includes方法接受三个参数,其中第二和第三个都不知道是干啥的...估计也不太用得到,就暂时不管了... stateOrName:字符串(必填). 是一个…

前端学习(2487):在VUE中使用element-ui的el-select组件时出现该报错

一. 报错场景 在VUE中使用element-ui的el-select组件时出现该报错 [Vue warn]: Missing required prop: "value" 1 二. 报错原因 2.1.el-select中没有进行双向数据绑定&#xff08;v-model&#xff09; 2.2 el-option没有进行value赋值 三. 具体示例 3.1 报错…

php 正则mysql语句_MySQL正则表达式搜索 - mysql数据库栏目 - 自学php

products表如下&#xff1a;1. 基本字符匹配vcrH1NrV7j2wdDL0cv3o6zWu9KqcHJvZF9uYW1l1tCw/LqswcvLcvRy/e1xNfWt/uzb/J0tTBy6OstvhMSUtFyOe57K708PNqMXkt/ujrMTHw7TSqsfzcHJvZF9uYW1l0vL0cv3tcTX1rf70qrN6sirxqXF5KO60rKzcrHy7XPwsPmtcTA/dfTo6zQ6NKqyrnTwyBMSUtFIA"JetPa…

python 类和对象 有必要学吗_类与对象-python学习19

类与对象类&#xff1a;我们常用类来划分一个个特定的群体&#xff1b;我们所说的类&#xff0c;是物以类聚的类&#xff0c;是分门别类的类&#xff0c;是多个类似事物组成的群体的统称。类的概念能帮助我们快速理解和判断事物的性质。类(class)&#xff0c;比如整数、字符串、…

最简单的基于FFmpeg的移动端样例:IOS 视频转码器

最简单的基于FFmpeg的移动端样例系列文章列表&#xff1a;最简单的基于FFmpeg的移动端样例&#xff1a;Android HelloWorld最简单的基于FFmpeg的移动端样例&#xff1a;Android 视频解码器最简单的基于FFmpeg的移动端样例&#xff1a;Android 视频解码器-单个库版最简单的基于F…