hibernate

Hibernate是一款重量级的持久层框架,目前市面上的我很少见还有项目在开发时候使用他,之所以要学习这个,因为公司最近有一个系统升级的项目,之前的老系统用到了Hibernate。

同样还是老套路,学习一个新技术或者新知识,首先去他的官网看

【官网】:https://hibernate.org/orm/
【官方教程】:https://hibernate.org/orm/documentation/getting-started/
【github地址】:https://github.com/hibernate


目前hibernate已经更新到了6的版本,这里使用的5的版本

注意: Hibernate5.1;5.2官方推荐使用JDK1.8以及JDBC4

文章目录

  • hibernate
  • 一、generator主键策略
  • 二、对象关系映射:一对多映射
    • 2.1 测试准备
    • 2.2 创建实体
    • 2.3 hbm.xml文件修改
    • 2.4 编写测试类
  • 三、casecode和inverse配置
    • 3.1 CaseCade级联操作
    • 3.2 INVERSE反转配置
  • 四、对象关系映射:多对多映射
    • 4.1 多对多插入操作
      • 4.1.1 数据库设计
      • 4.1.2 对象设计
      • 4.1.3 映射的配置:fire::fire:
    • 4.2 多对多查询
    • 4.3 多对多级联添加操作
  • 五、对象关系映射:一对一映射
    • 5.1 数据库设计
    • 5.2 实体类设计
      • 5.2.1 外键关联
      • 5.2.2 主键关联
    • 5.3 配置文件
      • 5.3.1 外键关联
      • 5.3.2 主键关联
    • 5.4 测试
    • 5.4.1 外键关联
    • 5.4.2 主键关联

一、generator主键策略


generator配置:代表hibernate主键生成策略

【我们可以将其分为三大类】:

  1. 由数据库维护

    • identity:Mysql的auto_increment维护主键自增策略
    • sequence:Oracle使用sequence序列维护主键自增策略
    • native :本地策略,由hibernate自己根据数据库选择最优策略
  2. 由hibernate维护
    • uuid:生成32位16进制的无效字符串【记住是一个字串】
    • increment:生成递增的数值类型(每次先查当前的最大的id值+1)
  3. 由开发者维护
    • asigned:必须要有程序员给定id的值,否则报错

二、对象关系映射:一对多映射

需求案例:客户 与 订单的需求关系:典型的一对多的关系

2.1 测试准备

这里我们需要在创建一张表t_order

CREATE TABLE `t_order` (`id` INT(10) NOT NULL AUTO_INCREMENT,`order_no` VARCHAR(20) NULL DEFAULT NULL COMMENT '订单编号' COLLATE 'utf8mb4_general_ci',`product_name` VARCHAR(20) NULL DEFAULT NULL COMMENT '产品名称' COLLATE 'utf8mb4_general_ci',`cust_id` INT(10) NULL DEFAULT NULL,PRIMARY KEY (`id`) USING BTREE,UNIQUE INDEX `t_order_id_uindex` (`id`) USING BTREE,INDEX `t_order_t_customer_c_id_fk` (`cust_id`) USING BTREE,CONSTRAINT `t_order_t_customer_c_id_fk` FOREIGN KEY (`cust_id`) REFERENCES `hibernate_db`.`t_customer` (`c_id`) ON UPDATE NO ACTION ON DELETE NO ACTION
)
COLLATE='utf8mb4_general_ci'
ENGINE=InnoDB
AUTO_INCREMENT=2;

2.2 创建实体

注意事项:

  1. 需要在Custom实体中先给一个List<Order>来关联多方的实体信息

  2. order实体表也需要给一个Custom的JavaBean对其进行关联

【Order】

public class Order implements Serializable {private static final long serialVersionUID = 1L;private String id; // 订单表主键private String orderNo; // 订单编号private String prodName; // 产品名称private Integer custId; // 外键客户id/*一个订单对一个客户,一个客户对多个订单*/private Customer customer;
}

2.3 hbm.xml文件修改

【customer.hbm.xml】
在Custom.hbm.xml文件里,我们需要做的是将order进行关联用set标签

<class name="com.wei.domain.Customer" table="t_customer"><id name="id" column="c_id"><generator class="identity"></generator></id><property name="name" column="c_name"></property><property name="age" column="c_age"></property><property name="gender" column="c_gender"></property><property name="level" column="c_level"></property><!--一对多配置--><!--name设置本实体类(customer)关联的属性字段名--><set name="orders" ><!--外键的字段名称--><key column="cust_id"></key><!--关联的实体对象的完整类路径--><one-to-many class="com.wei.domain.Order"/></set></class>

一表中的关联配置使用的标签是:<one-to-many class="所关联的类的全类名"></on-to-mony>

【order.hbm.xml】

<class name="com.wei.domain.Order" table="t_order"><id name="id" column="id"><generator class="native"/></id><property name="orderNo" column="order_no"/><property name="prodName" column="product_name"/><!--多对一配置--><many-to-one name="customer" column="cust_id" class="com.wei.domain.Customer"></many-to-one></class>

多表中所关联的字段是用的标签是<many-to-one name="关联的本实体类在的字段名" column="外键字段" class=“所引用的实体类的全类名”></many-to-one>

2.4 编写测试类

    @Testpublic void test1() throws HibernateException {// 准备数据/** 需求:一个客户两个订单* */Customer lisi  = new Customer();lisi.setName("里斯");lisi.setGender("1");lisi.setAge(32);lisi.setLevel("至尊VIP,年卡8级");Set<Order> orders = new HashSet<>();// 订单1Order order1 = new Order();order1.setOrderNo("20220807111");order1.setProdName("小米Ultr11");order1.setCustomer(lisi);// 订单2Order order2 = new Order();order2.setOrderNo("20220807134");order2.setProdName("华为MateBook_Pro 512G+8G");order2.setCustomer(lisi);// 客户添加订单orders.add(order1);orders.add(order2);lisi.setOrders(orders);Session session = HibernateUtil.getConnection();//4、开启事务Transaction tx = session.beginTransaction();//5、执行添加操作session.save(lisi);session.save(order1);session.save(order2);//6、提交事务tx.commit();//7、关闭资源HibernateUtil.closeSession(session);}

【订单表】

【客户表】

为了可以证实是否插入成功,我么可以再写一个方法来查询某一个客户的订单

/*** 查询用户guan连查询其所的订单** @throws HibernateException*/@Testpublic void test2() throws HibernateException {Session session = HibernateUtil.getConnection();//4、开启事务Transaction tx = session.beginTransaction();//5、执行添加操作Customer customer = session.get(Customer.class, 5);System.out.println("用户名称:"+customer.getName());Set<Order> orders = customer.getOrders();for (Order order : orders) {System.out.println("订单:"+order.getOrderNo());}//6、提交事务tx.commit();//7、关闭资源HibernateUtil.closeSession(session);}

三、casecode和inverse配置

3.1 CaseCade级联操作

级联操作,就是操作一个对象的时候,相同时操作他的关联对象。

  • 级联保存
<set name="orders" cascade="save-update"><!--外键的字段名称--><key column="cust_id"></key><one-to-many class="com.wei.domain.Order"/>
</set>

【测试】

@Testpublic void test3() throws HibernateException {// 准备数据Customer lisi = new Customer();lisi.setName("马云云");lisi.setGender("1");lisi.setAge(34);lisi.setLevel("至尊VIP,年卡n级");Set<Order> orders = new HashSet<>();// 订单1Order order1 = new Order();order1.setOrderNo("20220808123");order1.setProdName("阿里巴巴");order1.setCustomer(lisi);// 订单2Order order2 = new Order();order2.setOrderNo("20220808141");order2.setProdName("华强北 只能IPHONE watch");order2.setCustomer(lisi);// 客户添加订单orders.add(order1);orders.add(order2);lisi.setOrders(orders);Session session = HibernateUtil.getConnection();//4、开启事务Transaction tx = session.beginTransaction();//5、执行添加操作session.save(lisi); // 保存客户// 级联保存订单数据,所以配置在客户的映射文件中//6、提交事务tx.commit();//7、关闭资源HibernateUtil.closeSession(session);}

  • 级联删除
<set name="orders" cascade="save-update,delete" ><!--外键的字段名称--><key column="cust_id"></key><one-to-many class="com.wei.domain.Order"/>
</set>

【测试】

 @Testpublic void test4() throws HibernateException {Session session = HibernateUtil.getConnection();//4、开启事务Transaction tx = session.beginTransaction();//5、执行添加操作Customer cus = session.get(Customer.class, 6);// 级联删除//6、提交事务session.delete(cus);tx.commit();//7、关闭资源HibernateUtil.closeSession(session);}

如果没有级联删除,则会把外键的值置为空。级联删除则会在删除一个对象的同时将其关联的的对象也删除。


【实现级联操作的注意事项】:

重量级ORM框架--持久化框架Hibernate【关系映射详解】相关推荐

  1. Hibernate对象关系映射详解之一对多关系映射

    Hibernate对象关系映射详解之"一对多"关系映射 之前学习Hibernate框架的时候,对这七大关系映射一直是云里雾里的,虽然可以仿照写出代码,但是不能独立编写出来.鉴于工作 ...

  2. 【大话Hibernate】Hibernate两种实体关系映射详解

    实体类与数据库之间存在某种映射关系,Hibernate依据这种映射关系完成数据的存取,因此映射关系的配置在Hibernate中是最关键的.Hibernate支持xml配置文件与@注解配置两种方式.xm ...

  3. 第二章 关系映射详解

    本章学习目标 generator 主键策略 对象关系映射之一对多映射 cascade 和 inverse 配置详解 对象关系映射之多对多映射 对象关系映射之一多一映射 1. generator主键策略 ...

  4. hibernate 表关系映射详解之继承关系

    举例:亚马逊的网上商城可以卖很多东西,比如说图书,电器,水果等等,那么我们以面向对象的理念去抽象一个商品类,他具有商品的共有属性,比如说上架时间,当前         价格,优惠价格等待,商品可以继承 ...

  5. Hibernate一对多/多对一关系映射详解及相应的增删查改操作

    以客户与订单的关系为例 1.在实体模型类中绑定两者关系: 客户类: public class Customer {private Integer id;//客户idprivate String nam ...

  6. hibernate 表关系映射详解之多对多

    举例:商品类型表与商品表,每种类型对应多个商品,每个商品对应多种类型 关系图: hirbernate实现多对多映射有两种方法,第一种是通过中间表直接映射,第二种是通过中间表间接映射. 直接映射: 配置 ...

  7. Hibernate关系映射

    Hibernate关系映射 Hibernate关系映射其实就是将关系模型中实体之间的三种关系--多对一(一对多).一对一.多对多映射成对象模型--Java这样的面向对象语言中相应的属性之间的关系. 多 ...

  8. 三大框架题目整合考试题(含详解)

    三大框架题目整合考试题(含详解) 1.在Hibernate的关联关系映射配置中,下列选项对于inverse说法错误的是(bd). (选择二项) A. inverse属性指定了关联关系中的方向 //in ...

  9. php事件和行为,Yii框架组件和事件行为管理详解

    Yii框架组件和事件行为管理详解 来源:中文源码网    浏览: 次    日期:2018年9月2日 [下载文档:  Yii框架组件和事件行为管理详解.txt ] (友情提示:右键点上行txt文档名- ...

  10. 自动化测试框架[Cypress命令行执行测试详解]

    前提 已经熟练掌握了Cypress的基本知识,请参考自动化测试框架[Cypress概述]和自动化测试框架[各自动化测试框架比较] 已经熟练掌握Cypress环境配置,请参考自动化测试框架[Cypres ...

最新文章

  1. java 电梯算法_编程之美之小飞的电梯调度算法(多种解法)---Java语言
  2. 外呼机器人起名_电销外呼机器人如此受欢迎,今天终于知道原因了
  3. php fpm子进程数配置,php-fpm进程管理方式以及子进程数量配置原则详解
  4. Java基础学习总结(119)——Java8 JVM与Java7 JVM比较
  5. 39-java 输入输出总结
  6. 技术文化和惨淡命运 —— 怀念中国雅虎
  7. opencv4下使用SVM进行简单颜色分类
  8. mysql emoy表情_emo表情包 - emo微信表情包 - emoQQ表情包 - 发表情 fabiaoqing.com
  9. 1 Nginx性能优化方法
  10. 英飞凌 AURIX TC3XX 系列单片机的链接文件
  11. 课堂笔记-多元函数微分
  12. k8s-滚动更新与健康检查
  13. 软件项目管理附加实验一(项目调研)
  14. python网球比赛模拟主持稿_主持人大赛的模拟主持稿件模板推荐
  15. 让自己最开心最幸福的事
  16. 计算机网络中的电路交换的优缺点,从多方面比较电路交换、报文交换和分组交换的主要优缺点...
  17. mybatis plus报错:Invalid bound statement (not found)
  18. 加拿大计算机专业面试,《移民易出国网》成功案例:加拿大技术移民,计算机程序员-30个月单免(免面试)...
  19. 使用手机软件KSWEB快速搭建网站
  20. VINS-Mono 代码解读

热门文章

  1. 电脑计算机安全模式在哪,电脑怎么进入安全模式? 进入安全模式详细教程
  2. 众核tilera的使用
  3. linux设置双屏拼接_Linux下双屏显示设置
  4. 腾讯android一键root工具,腾讯一键root手机版
  5. L2-016 愿天下有情人都是失散多年的兄妹 (25分)
  6. HTML a 标签详解
  7. Vue基础知识总结 11:前端路由vue-router
  8. dom影像图形成数字地形图_DOM卫星影像
  9. 李白最经典的20首诗排行榜
  10. 陈如波律师:孙宇晨说自己“合法合规”站得住脚吗?