一对多

场景模拟:用户(一)对订单(多)

1.建表

  创建客户表,字段有:客户id,客户姓名,客户性别,客户年龄,客户年纪,客户电话。

  创建订单表,字段有:订单编号,明细编号,客户编号(外键)

  1. DROP TABLE IF EXISTS ordersA;
  2. DROP TABLE IF EXISTS customerA;

  3. CREATE TABLE customerA(
  4. cust_id TINYINT PRIMARY KEY AUTO_INCREMENT,
  5. cust_name    VARCHAR(30),
  6. cust_gender   CHAR(5),
  7. cust_age SMALLINT,
  8. cust_phone VARCHAR(20)
  9. );
  10.  
  11. CREATE TABLE ordersA(
  12. order_id VARCHAR(50) PRIMARY KEY,
  13. detail_id VARCHAR(50),
  14. cust_order_id TINYINT,
  15. CONSTRAINT fk_customerA_ordersA FOREIGN KEY(cust_order_id) REFERENCES customerA(cust_id) ON DELETE CASCADE
  16. );

2.创建项目,配置hibernate.cfg.xml主配置文件

  1. <?xml version = "1.0" encoding = "UTF-8"?>
  2. <!DOCTYPE hibernate-configuration PUBLIC
  3. "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
  4. "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
  5.  
  6. <hibernate-configuration>
  7. <session-factory>
  8.  
  9. <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
  10. <property name="hibernate.connection.url">jdbc:mysql:///test</property>
  11. <property name="hibernate.connection.username">root</property>
  12. <property name="hibernate.connection.password">123456</property>
  13.  
  14. <property name="hibernate.show_sql">true</property>
  15. <property name="hibernate.format_sql">true</property>
  16. <property name="hibernate.hbm2ddl.auto">update</property>
  17. <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
  18.  
  19. <!-- 指定session与当前线程绑定 -->
  20. <property name="hibernate.current_session_context_class">thread</property>
  21.  
  22. </session-factory>
  23. </hibernate-configuration>

3.创建实体

  创建用户实体类:基本属性+配置一对多的属性(set集合存储多个订单)

    创建订单实体类:基本属性+配置多对一的属性(Customer类存储客户实体)

  1. package deep.domain;
  2.  
  3. import java.io.Serializable;
  4. import java.util.HashSet;
  5. import java.util.Set;
  6.  
  7. /**
  8. * 客户实体类
  9. * @author DeepSleeping
  10. *
  11. */
  12. public class Customer implements Serializable {
  13.  
  14. private static final long serialVersionUID = 1L;
  15. private Integer cust_id;
  16. private String cust_name;
  17. private String cust_gender;
  18. private Integer cust_age;
  19. private String cust_phone;
  20.  
  21. /*
  22. * 一对多
  23. * */
  24. private Set<Order> ods = new HashSet<Order>();
  25.  
  26. public Integer getCust_id() {
  27. return cust_id;
  28. }
  29.  
  30. public void setCust_id(Integer cust_id) {
  31. this.cust_id = cust_id;
  32. }
  33.  
  34. public String getCust_name() {
  35. return cust_name;
  36. }
  37.  
  38. public void setCust_name(String cust_name) {
  39. this.cust_name = cust_name;
  40. }
  41.  
  42. public String getCust_gender() {
  43. return cust_gender;
  44. }
  45.  
  46. public void setCust_gender(String cust_gender) {
  47. this.cust_gender = cust_gender;
  48. }
  49.  
  50. public Integer getCust_age() {
  51. return cust_age;
  52. }
  53.  
  54. public void setCust_age(Integer cust_age) {
  55. this.cust_age = cust_age;
  56. }
  57.  
  58. public String getCust_phone() {
  59. return cust_phone;
  60. }
  61.  
  62. public void setCust_phone(String cust_phone) {
  63. this.cust_phone = cust_phone;
  64. }
  65.  
  66. public Set<Order> getOds() {
  67. return ods;
  68. }
  69.  
  70. public void setOds(Set<Order> ods) {
  71. this.ods = ods;
  72. }
  73.  
  74. }
  1. package deep.domain;
  2.  
  3. import java.io.Serializable;
  4.  
  5. /**
  6. * 订单实体类
  7. * @author DeepSleeping
  8. *
  9. */
  10. public class Order implements Serializable{
  11.  
  12. private static final long serialVersionUID = 1L;
  13. private String order_id;
  14. private String detail_id;
  15.  
  16. /*
  17. * 多对一
  18. */
  19. private Customer cst;
  20.  
  21. public String getOrder_id() {
  22. return order_id;
  23. }
  24. public void setOrder_id(String order_id) {
  25. this.order_id = order_id;
  26. }
  27. public String getDetail_id() {
  28. return detail_id;
  29. }
  30. public void setDetail_id(String detail_id) {
  31. this.detail_id = detail_id;
  32. }
  33. public Customer getCst() {
  34. return cst;
  35. }
  36. public void setCst(Customer cst) {
  37. this.cst = cst;
  38. }
  39.  
  40. }

4.配置实体的映射文件:Customer.hbm.xml,Order.hbm.xml

  Customer.hbm.xml中的set标签对中:

  set:存储多的一方的集合 name:存储多的一方的集合属性名

  key标签对:配置外键

  column:是数据库中外键的字段名(注意这里写的名一定要与后面多方中配置外键的名称一致,否则就会创建多个外键)

<one-to-many> 是表示,我这里是一对多,对的多的一方的实体类的路径是:class = "order"(这里只写order是因为在配置文件中我已经用package定位到实体类的包下了)

  1. <?xml version = "1.0" encoding = "UTF-8"?>
  2. <!DOCTYPE hibernate-mapping PUBLIC
  3. "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
  4. "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
  5. <hibernate-mapping package="deep.domain">
  6. <class name="Customer" table="customera">
  7. <id name="cust_id" column = "cust_id">
  8. <generator class="native"></generator>
  9. </id>
  10.  
  11. <property name="cust_name" column = "cust_name"></property>
  12. <property name="cust_gender" column = "cust_gender"></property>
  13. <property name="cust_age" column = "cust_age"></property>
  14. <property name="cust_phone" column = "cust_phone"></property>
  15.  
  16. <!-- 配置一对多属性 -->
  17. <set name="ods">
  18. <key column="cust_order_id"></key>
  19. <one-to-many class="Order"/>
  20. </set>
  21.  
  22. </class>
  23.  
  24. </hibernate-mapping>
  1. <?xml version = "1.0" encoding = "UTF-8"?>
  2. <!DOCTYPE hibernate-mapping PUBLIC
  3. "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
  4. "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
  5. <hibernate-mapping package="deep.domain">
  6. <class name="Order" table="ordersa">
  7. <id name="order_id" column = "order_id">
  8. <generator class="uuid"></generator>
  9. </id>
  10.  
  11. <property name="detail_id" column = "detail_id"></property>
  12.  
  13. <!-- 配置多对一属性 -->
  14. <many-to-one name="cst" column="cust_order_id" class="Customer"/>
  15. </class>
  16. </hibernate-mapping>

5.在主配置文件中引入两个实体对应的映射文件

  1. <mapping resource="deep/domain/Customer.hbm.xml"/>
  2. <mapping resource="deep/domain/Order.hbm.xml"/>

6.添加订单到客户id为1的客户中

  1. package deep.test;
  2.  
  3. import java.util.UUID;
  4.  
  5. import org.hibernate.Session;
  6. import org.junit.Test;
  7.  
  8. import deep.common.HibernateUtils;
  9. import deep.domain.Customer;
  10. import deep.domain.Order;
  11.  
  12. public class TestClass {
  13.  
  14. /**
  15. * 添加订单到客户
  16. */
  17. @Test
  18. public void fun(){
  19.  
  20. Session session = HibernateUtils.getSession();
  21. session.getTransaction().begin();
  22.  
  23. try {
  24. //获取客户 持久
  25. Customer cst = session.get(Customer.class, 1);
  26. //新建订单 瞬时
  27. Order od = new Order();
  28. od.setOrder_id(UUID.randomUUID().toString());
  29. od.setDetail_id(UUID.randomUUID().toString());
  30. //表达客户和订单的关系
  31. cst.getOds().add(od);
  32. //表达订单和客户的关系
  33. od.setCst(cst);
  34. //持久化订单
  35. session.save(od);
  36. } catch (Exception e) {
  37. session.getTransaction().rollback();
  38. e.printStackTrace();
  39. }
  40.  
  41. session.getTransaction().commit();
  42. }
  43. }

添加订单成功!

Hibernate入门(七)一对多入门案例的更多相关文章

  1. 嵌入式OS入门笔记-以RTX为案例:六.RTX的任务调度

    嵌入式OS入门笔记-以RTX为案例:六.RTX的任务调度 上一篇笔记介绍了一些绕开排程器(或调度程序,scheduler)来进行时间管理的一些小方法.这一篇详细介绍RTX的任务调度原理. RTX主要有 ...

  2. C语言第七讲,函数入门.

    C语言第七讲,函数入门. 一丶了解面向过程和面向对象的区别. 为什么要先讲面向过程和面向对象的区别? 面向过程,就是什么都要自己做.  比如你要吃饭. 那么你得自己做饭. 面向对象, 面向对象就是我要 ...

  3. C#基础入门 七

    C#基础入门 七 接口 由于C#语言不支持多重继承,所以可以使用接口模拟结构的继承,通过使用interface关键字,定义一个接口. interface USB { void Read(string[ ...

  4. Python爬虫入门七之正则表达式

    在前面我们已经搞定了怎样获取页面的内容,不过还差一步,这么多杂乱的代码夹杂文字我们怎样把它提取出来整理呢?下面就开始介绍一个十分强大的工具,正则表达式! 1.了解正则表达式 正则表达式是对字符串操作的 ...

  5. 转 Python爬虫入门七之正则表达式

    静觅 » Python爬虫入门七之正则表达式 1.了解正则表达式 正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符.及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串 ...

  6. Jmeter Web 性能测试入门 (七):Performance 测试中踩过 Jmeter 的坑

    脚本运行的过程中,大量request抛error,但没有地方能够查看request是因为什么error的. 原因:Jmeter默认禁掉了运行过程中每个request的具体response信息收集,只保 ...

  7. Mybatis框架基础入门(七)--关联查询

    1.一对一查询 1.1 使用resultType接收查询结果 修改pojo类 public class OrderUser extends order { private String usernam ...

  8. (多核DSP快速入门)SYS/BIOS入门

    (多核DSP快速入门)SYS/BIOS入门   原创文章 转载请注册来源http://blog.csdn.net/tostq 系列教程目录:http://blog.csdn.net/tostq/art ...

  9. 毫无基础的人入门Python,Python入门教程

    随着人工智能的发展,Python近两年也是大火,越来越多的人加入到Python学习大军,对于毫无基础的人该如何入门Python呢?这里整理了一些个人经验和Python入门教程供大家参考. 如果你是零基 ...

随机推荐

  1. JAVA程序CPU 100%问题排查

    做JAVA开发的同学一定遇到过的爆表问题,看这里解决  https://www.cnblogs.com/qcloud1001/p/9773947.html   本文由净地发表于云+社区专栏 记一次Ja ...

  2. 【java】java反射初探 ——“当类也学会照镜子”

    反射的作用   开门见山地说说反射的作用   1.为我们提供了全面的分析类信息的能力 2.动态加载类   我理解的“反射”的意义 (仅个人理解哈)   我理解的java反射机制就是: 提供一套完善而强 ...

  3. Struts2新漏洞S2-046在线实验环境全球首发

    Strust2 又出现漏洞啦?搞事情啊? 据说S2-046漏洞和S2-045漏洞非常相似,都是由报错信息带入了buildErrorMessage方法造成的, 只是这次存在两个触发点哦!危害嘛,你说嘞? ...

  4. FFmpeg 学习(一):FFmpeg 简介

    一.FFmpeg 介绍 FFmpeg是一套可以用来记录.转换数字音频.视频,并能将其转化为流的开源计算机程序.采用LGPL或GPL许可证.它提供了录制.转换以及流化音视频的完整解决方案.它包含了非常先 ...

  5. Javascript高级编程学习笔记(23)—— 函数表达式(1)递归

    前面的文章中,我在介绍JS中引用类型的时候提过,JS中函数有两种定义方式 第一种是声明函数,即使用function关键字来声明 第二种就是使用函数表达式,将函数以表达式的形式赋值给一个变量,这个变量就 ...

  6. 机器学习入门11 - 逻辑回归 (Logistic Regression)

    原文链接:https://developers.google.com/machine-learning/crash-course/logistic-regression/ 逻辑回归会生成一个介于 0 ...

  7. insert update delete 语法 以及用法

    insert update delete 被称为 数据定义语句语句 也就是数据的增加 修改 删除 其中不包括查询 譬如: create database -创建数据库 alter database - ...

  8. 告诉你,Spring Boot 真是个牛逼货!

    现在 Spring Boot 非常火,各种技术文章,各种付费教程,多如牛毛,可能还有些不知道 Spring Boot 的,那它到底是什么呢?有什么用?今天给大家详细介绍一下. Spring Boot ...

  9. 在IT行业获得成功 你只需一项技能[转]

    能同时使用五种编程语言(包括一种机器语言)?不是. 项目管理能力,再高就是获得PMP认证?也不是. 超强的口才和书面沟通能力,正如工作职位中描述的那样?这不是痛点,但可以学习. 我曾经与最好的IT专业 ...

  10. 呕心沥血之作,最多坑mysql5.7安装教程

    前言: 业务需要,需要数据库接binlog发数据变更消息,但是项目用到的数据库是mysql5.6,不支持,于是就有了接下来的一切一切,新的测试服务器上安装mysql5.7 安装步骤: 1.官网下载my ...