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;方便更直观的进…

工作63:await和anync

async function是异步函数没错&#xff0c;但是如果你中间并没有await关键字&#xff0c;那就和普通函数没有区别&#xff0c;当第一个await关键字出现后&#xff0c;其后面的内容可视为Promise.then的回调&#xff0c;但如果这个Promise在进入你这个await之前被reject的话&…

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

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

C#使用Microsoft.ACE.OLEDB.12.0 需要安装的组件

下载地址&#xff1a;http://www.microsoft.com/zh-cn/download/details.aspx?id13255 64、32请对号入座转载于:https://www.cnblogs.com/wrhming/p/7192816.html

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

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

一个简单的时间轴demo

一个时间轴的组成 使用一个块级元素包裹内容&#xff0c;并未块级元素设置边框定义圆形或者菱形等元素标签&#xff0c;子元素设置偏移或者定位元素将图标定位到边框上使其中的内容不溢出&#xff0c;自动换行&#xff0c;内容自动撑高 英文自动换行&#xff1a;word-wrap:brea…

OC发送短信

- (IBAction)sendMessage1:(id)sender {UIAlertView *alert [[UIAlertView alloc]initWithTitle:"短信编辑"message:nil delegate:self cancelButtonTitle:"确定" otherButtonTitles:"取消", nil];alert.tag 1;alert.alertViewStyle UIAlertV…

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…

java amr 转mp3 报错_amr 转 MP3 报错it.sauronsoftware.jave.InputFormatException问

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼import it.sauronsoftware.jave.AudioAttributes;import it.sauronsoftware.jave.Encoder;import it.sauronsoftware.jave.EncoderException;import it.sauronsoftware.jave.EncodingAttributes;import it.sauronsoftware.jave.Inp…

正则表达式验证各种类型的数字

验证数字的正则表达式集 验证数字&#xff1a;^[0-9]*$ 验证n位的数字&#xff1a;^\d{n}$ 验证至少n位数字&#xff1a;^\d{n,}$ 验证m-n位的数字&#xff1a;^\d{m,n}$ 验证零和非零开头的数字&#xff1a;^(0|[1-9][0-9]*)$ 验证有两位小数的正实数&#xff1a;^[0-9](.[0-9…

mysql 触发器 for each row 理解_“for each row”如何在mysql中的触发器中工作?

FOR EACH ROW表示每个匹配行的更新或删除.除非查询中有where条件,否则触发器主体不会遍历整个表数据.下面演示了一个工作示例&#xff1a;创建样本表&#xff1a;drop table if exists tbl_so_q23374151;create table tbl_so_q23374151 ( i int, v varchar(10) );-- set test d…

iOS 11: CORE ML—浅析

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

mysql定义shell变量_shell 变量的定义,赋值,运算

一、变量类型1.1、自定义变量1.定义变量不能使用纯数字命名&#xff0c;不能使用横杠命名变量名变量值[rootlocalhost ~]# nameerha2.引用变量$变量名 或者 ${变量量名}3.查看变量值echo$变量量名[rootlocalhost ~]# echo $nameerha4.取消变量[rootlocalhost ~]# unset name[ro…