Hibernate入门(七)一对多入门案例
一对多
场景模拟:用户(一)对订单(多)
1.建表
创建客户表,字段有:客户id,客户姓名,客户性别,客户年龄,客户年纪,客户电话。
创建订单表,字段有:订单编号,明细编号,客户编号(外键)
- DROP TABLE IF EXISTS ordersA;
- DROP TABLE IF EXISTS customerA;
- CREATE TABLE customerA(
- cust_id TINYINT PRIMARY KEY AUTO_INCREMENT,
- cust_name VARCHAR(30),
- cust_gender CHAR(5),
- cust_age SMALLINT,
- cust_phone VARCHAR(20)
- );
- CREATE TABLE ordersA(
- order_id VARCHAR(50) PRIMARY KEY,
- detail_id VARCHAR(50),
- cust_order_id TINYINT,
- CONSTRAINT fk_customerA_ordersA FOREIGN KEY(cust_order_id) REFERENCES customerA(cust_id) ON DELETE CASCADE
- );
2.创建项目,配置hibernate.cfg.xml主配置文件
- <?xml version = "1.0" encoding = "UTF-8"?>
- <!DOCTYPE hibernate-configuration PUBLIC
- "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
- "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
- <hibernate-configuration>
- <session-factory>
- <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
- <property name="hibernate.connection.url">jdbc:mysql:///test</property>
- <property name="hibernate.connection.username">root</property>
- <property name="hibernate.connection.password">123456</property>
- <property name="hibernate.show_sql">true</property>
- <property name="hibernate.format_sql">true</property>
- <property name="hibernate.hbm2ddl.auto">update</property>
- <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
- <!-- 指定session与当前线程绑定 -->
- <property name="hibernate.current_session_context_class">thread</property>
- </session-factory>
- </hibernate-configuration>
3.创建实体
创建用户实体类:基本属性+配置一对多的属性(set集合存储多个订单)
创建订单实体类:基本属性+配置多对一的属性(Customer类存储客户实体)
- package deep.domain;
- import java.io.Serializable;
- import java.util.HashSet;
- import java.util.Set;
- /**
- * 客户实体类
- * @author DeepSleeping
- *
- */
- public class Customer implements Serializable {
- private static final long serialVersionUID = 1L;
- private Integer cust_id;
- private String cust_name;
- private String cust_gender;
- private Integer cust_age;
- private String cust_phone;
- /*
- * 一对多
- * */
- private Set<Order> ods = new HashSet<Order>();
- public Integer getCust_id() {
- return cust_id;
- }
- public void setCust_id(Integer cust_id) {
- this.cust_id = cust_id;
- }
- public String getCust_name() {
- return cust_name;
- }
- public void setCust_name(String cust_name) {
- this.cust_name = cust_name;
- }
- public String getCust_gender() {
- return cust_gender;
- }
- public void setCust_gender(String cust_gender) {
- this.cust_gender = cust_gender;
- }
- public Integer getCust_age() {
- return cust_age;
- }
- public void setCust_age(Integer cust_age) {
- this.cust_age = cust_age;
- }
- public String getCust_phone() {
- return cust_phone;
- }
- public void setCust_phone(String cust_phone) {
- this.cust_phone = cust_phone;
- }
- public Set<Order> getOds() {
- return ods;
- }
- public void setOds(Set<Order> ods) {
- this.ods = ods;
- }
- }
- package deep.domain;
- import java.io.Serializable;
- /**
- * 订单实体类
- * @author DeepSleeping
- *
- */
- public class Order implements Serializable{
- private static final long serialVersionUID = 1L;
- private String order_id;
- private String detail_id;
- /*
- * 多对一
- */
- private Customer cst;
- public String getOrder_id() {
- return order_id;
- }
- public void setOrder_id(String order_id) {
- this.order_id = order_id;
- }
- public String getDetail_id() {
- return detail_id;
- }
- public void setDetail_id(String detail_id) {
- this.detail_id = detail_id;
- }
- public Customer getCst() {
- return cst;
- }
- public void setCst(Customer cst) {
- this.cst = cst;
- }
- }
4.配置实体的映射文件:Customer.hbm.xml,Order.hbm.xml
Customer.hbm.xml中的set标签对中:
set:存储多的一方的集合 name:存储多的一方的集合属性名
key标签对:配置外键
column:是数据库中外键的字段名(注意这里写的名一定要与后面多方中配置外键的名称一致,否则就会创建多个外键)
<one-to-many> 是表示,我这里是一对多,对的多的一方的实体类的路径是:class = "order"(这里只写order是因为在配置文件中我已经用package定位到实体类的包下了)
- <?xml version = "1.0" encoding = "UTF-8"?>
- <!DOCTYPE hibernate-mapping PUBLIC
- "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
- "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
- <hibernate-mapping package="deep.domain">
- <class name="Customer" table="customera">
- <id name="cust_id" column = "cust_id">
- <generator class="native"></generator>
- </id>
- <property name="cust_name" column = "cust_name"></property>
- <property name="cust_gender" column = "cust_gender"></property>
- <property name="cust_age" column = "cust_age"></property>
- <property name="cust_phone" column = "cust_phone"></property>
- <!-- 配置一对多属性 -->
- <set name="ods">
- <key column="cust_order_id"></key>
- <one-to-many class="Order"/>
- </set>
- </class>
- </hibernate-mapping>
- <?xml version = "1.0" encoding = "UTF-8"?>
- <!DOCTYPE hibernate-mapping PUBLIC
- "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
- "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
- <hibernate-mapping package="deep.domain">
- <class name="Order" table="ordersa">
- <id name="order_id" column = "order_id">
- <generator class="uuid"></generator>
- </id>
- <property name="detail_id" column = "detail_id"></property>
- <!-- 配置多对一属性 -->
- <many-to-one name="cst" column="cust_order_id" class="Customer"/>
- </class>
- </hibernate-mapping>
5.在主配置文件中引入两个实体对应的映射文件
- <mapping resource="deep/domain/Customer.hbm.xml"/>
- <mapping resource="deep/domain/Order.hbm.xml"/>
6.添加订单到客户id为1的客户中
- package deep.test;
- import java.util.UUID;
- import org.hibernate.Session;
- import org.junit.Test;
- import deep.common.HibernateUtils;
- import deep.domain.Customer;
- import deep.domain.Order;
- public class TestClass {
- /**
- * 添加订单到客户
- */
- @Test
- public void fun(){
- Session session = HibernateUtils.getSession();
- session.getTransaction().begin();
- try {
- //获取客户 持久
- Customer cst = session.get(Customer.class, 1);
- //新建订单 瞬时
- Order od = new Order();
- od.setOrder_id(UUID.randomUUID().toString());
- od.setDetail_id(UUID.randomUUID().toString());
- //表达客户和订单的关系
- cst.getOds().add(od);
- //表达订单和客户的关系
- od.setCst(cst);
- //持久化订单
- session.save(od);
- } catch (Exception e) {
- session.getTransaction().rollback();
- e.printStackTrace();
- }
- session.getTransaction().commit();
- }
- }
添加订单成功!
Hibernate入门(七)一对多入门案例的更多相关文章
- 嵌入式OS入门笔记-以RTX为案例:六.RTX的任务调度
嵌入式OS入门笔记-以RTX为案例:六.RTX的任务调度 上一篇笔记介绍了一些绕开排程器(或调度程序,scheduler)来进行时间管理的一些小方法.这一篇详细介绍RTX的任务调度原理. RTX主要有 ...
- C语言第七讲,函数入门.
C语言第七讲,函数入门. 一丶了解面向过程和面向对象的区别. 为什么要先讲面向过程和面向对象的区别? 面向过程,就是什么都要自己做. 比如你要吃饭. 那么你得自己做饭. 面向对象, 面向对象就是我要 ...
- C#基础入门 七
C#基础入门 七 接口 由于C#语言不支持多重继承,所以可以使用接口模拟结构的继承,通过使用interface关键字,定义一个接口. interface USB { void Read(string[ ...
- Python爬虫入门七之正则表达式
在前面我们已经搞定了怎样获取页面的内容,不过还差一步,这么多杂乱的代码夹杂文字我们怎样把它提取出来整理呢?下面就开始介绍一个十分强大的工具,正则表达式! 1.了解正则表达式 正则表达式是对字符串操作的 ...
- 转 Python爬虫入门七之正则表达式
静觅 » Python爬虫入门七之正则表达式 1.了解正则表达式 正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符.及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串 ...
- Jmeter Web 性能测试入门 (七):Performance 测试中踩过 Jmeter 的坑
脚本运行的过程中,大量request抛error,但没有地方能够查看request是因为什么error的. 原因:Jmeter默认禁掉了运行过程中每个request的具体response信息收集,只保 ...
- Mybatis框架基础入门(七)--关联查询
1.一对一查询 1.1 使用resultType接收查询结果 修改pojo类 public class OrderUser extends order { private String usernam ...
- (多核DSP快速入门)SYS/BIOS入门
(多核DSP快速入门)SYS/BIOS入门 原创文章 转载请注册来源http://blog.csdn.net/tostq 系列教程目录:http://blog.csdn.net/tostq/art ...
- 毫无基础的人入门Python,Python入门教程
随着人工智能的发展,Python近两年也是大火,越来越多的人加入到Python学习大军,对于毫无基础的人该如何入门Python呢?这里整理了一些个人经验和Python入门教程供大家参考. 如果你是零基 ...
随机推荐
- JAVA程序CPU 100%问题排查
做JAVA开发的同学一定遇到过的爆表问题,看这里解决 https://www.cnblogs.com/qcloud1001/p/9773947.html 本文由净地发表于云+社区专栏 记一次Ja ...
- 【java】java反射初探 ——“当类也学会照镜子”
反射的作用 开门见山地说说反射的作用 1.为我们提供了全面的分析类信息的能力 2.动态加载类 我理解的“反射”的意义 (仅个人理解哈) 我理解的java反射机制就是: 提供一套完善而强 ...
- Struts2新漏洞S2-046在线实验环境全球首发
Strust2 又出现漏洞啦?搞事情啊? 据说S2-046漏洞和S2-045漏洞非常相似,都是由报错信息带入了buildErrorMessage方法造成的, 只是这次存在两个触发点哦!危害嘛,你说嘞? ...
- FFmpeg 学习(一):FFmpeg 简介
一.FFmpeg 介绍 FFmpeg是一套可以用来记录.转换数字音频.视频,并能将其转化为流的开源计算机程序.采用LGPL或GPL许可证.它提供了录制.转换以及流化音视频的完整解决方案.它包含了非常先 ...
- Javascript高级编程学习笔记(23)—— 函数表达式(1)递归
前面的文章中,我在介绍JS中引用类型的时候提过,JS中函数有两种定义方式 第一种是声明函数,即使用function关键字来声明 第二种就是使用函数表达式,将函数以表达式的形式赋值给一个变量,这个变量就 ...
- 机器学习入门11 - 逻辑回归 (Logistic Regression)
原文链接:https://developers.google.com/machine-learning/crash-course/logistic-regression/ 逻辑回归会生成一个介于 0 ...
- insert update delete 语法 以及用法
insert update delete 被称为 数据定义语句语句 也就是数据的增加 修改 删除 其中不包括查询 譬如: create database -创建数据库 alter database - ...
- 告诉你,Spring Boot 真是个牛逼货!
现在 Spring Boot 非常火,各种技术文章,各种付费教程,多如牛毛,可能还有些不知道 Spring Boot 的,那它到底是什么呢?有什么用?今天给大家详细介绍一下. Spring Boot ...
- 在IT行业获得成功 你只需一项技能[转]
能同时使用五种编程语言(包括一种机器语言)?不是. 项目管理能力,再高就是获得PMP认证?也不是. 超强的口才和书面沟通能力,正如工作职位中描述的那样?这不是痛点,但可以学习. 我曾经与最好的IT专业 ...
- 呕心沥血之作,最多坑mysql5.7安装教程
前言: 业务需要,需要数据库接binlog发数据变更消息,但是项目用到的数据库是mysql5.6,不支持,于是就有了接下来的一切一切,新的测试服务器上安装mysql5.7 安装步骤: 1.官网下载my ...