一对多

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

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入门(七)一对多入门案例的更多相关文章

  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 内存泄漏的排查

    由来 前些日子小组内安排值班,轮流看顾我们的服务,主要做一些报警邮件处理.Bug 排查.运营 issue 处理的事.工作日还好,无论干什么都要上班的,若是轮到周末,那这一天算是毁了. 不知道是公司网络 ...

  2. Codeforces Round #554 (Div. 2) 1152B. Neko Performs Cat Furrier Transform

    学了这么久,来打一次CF看看自己学的怎么样吧 too young too simple 1152B. Neko Performs Cat Furrier Transform 题目链接:"ht ...

  3. flask上下文(new)

    flask源码解析之上下文 引入 对于flask而言,其请求过程与django有着截然不同的流程.在django中是将请求一步步封装最终传入视图函数的参数中,但是在flask中,视图函数中并没有请求参 ...

  4. 安全运维中基线检查的自动化之ansible工具巧用

    i春秋作家:yanzm 原文来自:安全运维中基线检查的自动化之ansible工具巧用 前几周斗哥分享了基线检查获取数据的脚本,但是在面对上百台的服务器,每台服务器上都跑一遍脚本那工作量可想而知,而且都 ...

  5. RichText 富文本开源项目总结

    在Android开发中,我们不免会遇到富文本的编辑和展示的需求,以下是本人之前star的富文本编辑器的开源项目,供大家参考: 一.RichEditor 开源项目地址:https://github.co ...

  6. 第89节:Java中的反射技术

    第89节:Java中的反射技术 反射技术是动态的获取指定的类,和动态的调用类中的内容(没有类前就可以创建对象,将对象的动作完成,这就是动态的获取指定的类). 配置文件把具体实现的类名称定义到配置文件中 ...

  7. map,set和weakmap,weakset

    概述 set和map属于es6的内容,今天在看书的时候遇到了,所以好好的总结一下,供以后开发时参考,相信对其他人也有用. 参考资料: mdn Keyed collections Map和WeakMap ...

  8. [Postman]发送第一个请求(1)

    通过API请求,您可以与具有要访问的API端点的服务器联系,并执行某些操作.这些操作是HTTP方法. 最常用的方法是GET,POST,PUT和DELETE.方法的名称是不言自明的.例如,GET使您可以 ...

  9. The SDK 'Microsoft.NET.Sdk' specified could not be found.

    有一台电脑用 VS Code 开发 .NET Core 项目时,每次打开文件夹都有一个错误(标题),定位在 C# 插件,鼠标放在代码上没有智能提醒,输入代码时没有补全提示,重装 VS Code 和所有 ...

  10. compose函数

    compose函数 在学习redux源码的时候看到了其中的工具函数compose,compose函数的作用就是组合函数,依次组合传入的函数: 后一个函数作为前一个函数的参数 最后一个函数可以接受多个参 ...