Hibernate一对多
例如:一个用户可以对应多个订单 但一个订单只能对应一个用户
1.创建实体类


2.编写映射文件
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.bdqn.cn.pojo2" >
<!-- 因为我们在上一行package里配置了包名所以name这里可以直接写实体类名
table对应数据库表名
-->
<class name="Student" table="student">
<!-- id对应的是主键name对应实体类属性名column对应数据库字段名 -->
<id name="stuid" column="stuid">
<!-- 主键生成策略 increment 适用于代理主键 由hibernate自动以递增的方式生成标识符 每次增量为1 -->
<generator class="increment"/>
</id>
<property name="sname" column="sname"/>
<!-- 我们实体类用到了set集合所以这里用set -->
<!-- cascade里面写save-update级联插入就是当这个表插入数据时和他关联的数据也会插入
delete级联删除和save-update同理
delete-orphan为孤儿删除 仅限于一对多 只有一对多时才会出现类似父子关系的存在 才有父子表的存在 认为一方为父方
也就是当一的一方和多的一方解除关系时 实际上就是外键值赋为null 将这总记录删除时就叫孤儿删除
双向维护会产生多余的sql,要想解决这个问题需要双方有一方放弃维护外键,一般都是一的一方放弃 需要在<set>标签里写inverse="true"
-->
<set name="orders" cascade="save-update,delete,delete-orphan" inverse="true">
<!-- 标签<key>用来描述一对多 多一方的外键名-->
<key column="cno"/>
<!-- 标签<one-to-many>设置一对多映射关系 class设置映射关联目标实体类 -->
<one-to-many class="Orders"/>
</set>
</class>
</hibernate-mapping>
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.bdqn.cn.pojo2">
<class name="Orders" table="orders">
<id name="oid" column="oid">
<generator class="increment"/>
</id>
<property name="addr" column="addr"/>
<!-- 标签<many-to-one>设置多对一映射关系 cloumn对应的外键名称
cascade在student映射文件已经解释
-->
<many-to-one name="stu" column="cno" class="Student" cascade="save-update"/>
</class>
</hibernate-mapping>
3.编写工具类

4.编写配置文件
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<property name="connection.url">
jdbc:mysql://localhost:3306/dsds
</property>
<property name="connection.driver_class">
com.mysql.jdbc.Driver
</property>
<property name="connection.username">root</property>
<property name="connection.password">123.com</property>
<property name="dialect">
org.hibernate.dialect.MySQLInnoDBDialect
</property>
<!-- 在控制台显不显示sql语句 -->
<property name="show_sql">true</property>
<!-- 格式化sql语句 -->
<property name="format_sql">true</property>
<!-- 指定自动生成数据表策略 -->
<property name="hbm2ddl.auto">update</property>
<!-- 指定hbm.xml就是映射文件 -->
<mapping resource="com/bdqn/cn/pojo2/Orders.hbm.xml" />
<mapping resource="com/bdqn/cn/pojo2/Student.hbm.xml" />
</session-factory>
</hibernate-configuration>
5.测试类
public class testDemo {
    //孤儿删除
    @Test
    public void test3() {
        Session session = HibernateUtil.openSession();
        Transaction tx = session.beginTransaction();
        Student stu1 = (Student) session.get(Student.class, 1);
        Orders ord1 = (Orders) session.get(Orders.class, 1);
        //删除客户与订单的关系也就是外键值为null  删除没有客户的订单就叫做孤儿删除
        stu1.getOrders().remove(ord1);
        tx.commit();
        session.close();
    }
    //级联删除
    @Test
    public void test2() {
        Session session = HibernateUtil.openSession();
        Transaction tx = session.beginTransaction();
        /*如果运行时出现Java . lang . stackoverflower error这个错误
            把toString里另一方的属性值删掉就可以了*/
        Student stu1 = (Student) session.get(Student.class, 1);
        System.out.println(stu1);
        session.delete(stu1);
        tx.commit();
        session.close();
    }
    //级联添加
    @Test
    public void test1() {
        Session session = HibernateUtil.openSession();
        Transaction tx = session.beginTransaction();
        Student student=new Student();
        student.setSname("张三");
        //建立两个订单
        Orders order1=new Orders();
        order1.setAddr("北京");
        Orders order2=new Orders();
        order2.setAddr("天津");
        //建立关系说明订单1和2属于student
        order1.setStu(student);
        order2.setStu(student);
        student.getOrders().add(order1);
        student.getOrders().add(order2);
        /**
         * 当设置了cascade="save-update"属性时添加用户时就会把对应的订单添加进去
         */
        session.save(student);
        tx.commit();
        session.close();
    }
}

Hibernate一对多的更多相关文章
- Hibernate一对多配置
		
刚刚学习了Hibernate框架的基础知识,下面我来说说关于Hibernate一对多的配置 首先是大配置 连接数据库 用户名 和密码 能和小配置连接 部门小配置: 员工小配置: 部门实体类 员工实体类 ...
 - hibernate  一对多双向关联 详解
		
一.解析: 1. 一对多双向关联也就是说,在加载班级时,能够知道这个班级所有的学生. 同时,在加载学生时,也能够知道这个学生所在的班级. 2.我们知道,一对多关联映射和多对一关联映射是一样的,都是在 ...
 - Hibernate一对多OnetoMany
		
------------------------Hibernate一对多OnetoMany 要点: 配置在一端. 1.如果是单向关联,即只在一端配置OneToMany,多端不配置ManyToOne.则 ...
 - Hibernate一对多单向关联和双向关联映射方法及其优缺点 (待续)
		
一对多关联映射和多对一关联映射实现的基本原理都是一样的,既是在多的一端加入一个外键指向一的一端外键,而主要的区别就是维护端不同.它们的区别在于维护的关系不同: 一对多关联映射是指在加载一的一端数据的同 ...
 - Hibernate一对多操作
		
--------------------siwuxie095 Hibernate 一对多操作 以客户和联系人为例,客户是一,联系人是多 即 一个客户里面有多个联系人,一个联系人只能属于一个客户 注意: ...
 - Java进阶知识10 Hibernate一对多_多对一双向关联(Annotation+XML实现)
		
本文知识点(目录): 1.Annotation 注解版(只是测试建表) 2.XML版 的实现(只是测试建表) 3.附录(Annotation 注解版CRUD操作)[注解版有个问题:插入值时 ...
 - Java进阶知识09 Hibernate一对多单向关联(Annotation+XML实现)
		
1.Annotation 注解版 1.1.在一的一方加Set 1.2.创建Customer类和Order类 package com.shore.model; import java.util.Hash ...
 - Hibernate—— 一对多 和 多对多关联关系映射(xml和注解)总结(转载)
		
One to Many 映射关系 多对一单向外键关联(XML/Annotation) 一对多单向外键关联(XML/Annotation) 懒加载和积极加载 一对多双向外键关联(XML/Annotati ...
 - Hibernate一对多(多对一)关联关系
		
上一篇博文总结了 Hibernate 的一对一的关联关系, 包括基于主键的单向一对一, 基于外键的单向一对一, 基于外键的双向一对一. 下面咱们说一下 Hibernate 的一对多关联关系. 其实一对 ...
 - 菜鸟学习Hibernate——一对多关系映射
		
Hibernate中的关系映射,最常见的关系映射之一就是一对多关系映射例如学生与班级的关系,一个班级对应多个学生.如图: Hibernate中如何来映射这两个的关系呢? 下面就为大家讲解一下: 1.创 ...
 
随机推荐
- JMeter之BeanShell断言---equals使用
			
判断变量是否为root if(!"${User}".equals("root")){ Failure=true; FailureMessage="ER ...
 - Linux下运行命令出现is not in the sudoers file的问题
			
原因: 用户没有加入到sudo的配置文件里. 解决方法: 1.切换到root用户,运行visudo命令: 2.找到root ALL=(ALL) ALL,在下面添加一行 xxx ALL=(ALL) ...
 - Nginx502,504和499错误解决方案
			
499错误解决方案 499错误是什么?让我们看看NGINX的源码中的定义: ngx_string(ngx_http_error_495_page), /* 495, https certificate ...
 - GDB调试系列之了解GDB
			
想要熟练利用GDB进行程序调试,首先要了解什么是GDB. 1. 什么是GDB GDB (the GNU Project Debugger) 是一个可以运行在大多数常见的UNIX架构.Windows.M ...
 - sys.argv的意义[转]
			
sys.argv的意义 原文地址:https://www.cnblogs.com/zzliu/p/10775049.html 简单来说,sys.argv是一个参数列表,这个列表存放着从外界获取到的参数 ...
 - git指令-添加远程仓库
			
git指令-添加远程仓库 首先在GitHub上创建属于你自己的远程仓库:例如我创建的远程仓库mybatis用于我最近保存的mybatis代码 目前,在GitHub上的这个learngit仓库还是空的, ...
 - Object-C 银行卡,信用卡校验规则(Luhn算法)
			
最近的项目中涉及到绑定用户的银行卡,借记卡.经过查找银行卡的校验规是采用 Luhn算法进行验证. Luhn算法,也被称作“模10算法”.它是一种简单的校验公式,一般会被用于身份证号码,IMEI号码,美 ...
 - 用canvas实现简单的下雪效果
			
首先新建一个html文件,将body的背景设置为天空的那种深蓝色,并创建一个canvas,canvas的操作逻辑都放在snow.js中: <!DOCTYPE html> <head& ...
 - 神奇的background——绘制图形
			
相信大家在平时工作中少不了会被要求在某些元添加一些特殊的背景图片,这时候通常就拿起ps就是切切切.不说这种方式麻烦,有ui给你切好的情况已经不错,没有的就有自己动手.还可能有需要切一整张超大图的情况. ...
 - 前端每日实战:48# 视频演示如何用纯 CSS 创作一盘传统蚊香
			
效果预览 按下右侧的"点击预览"按钮可以在当前页面预览,点击链接可以全屏预览. https://codepen.io/comehope/pen/BVpvMz 可交互视频教程 此视频 ...