1.1对象的持久化

            对象持久化是指将内存中的对象保存到可永久保存的存储设备中(如磁盘)的一种技术。(hibernate是通过id来管理对象)

1.2怎样实现持久化

1 对象序列化

2 JDBC

3 ORM 对象关系映射

4 JPA框架

5 hibernate

关系:ORM是一种思想,JPA是通过JAVA语言来实现这种思想,不过JPA只是一个接口,其中hibernate是具体实现这一接口的方法之一

2.1.1 sessionfactory接口

  重量级对象,单例的(可以按照单例来用) 线程安全的。不需要手动关闭并且系统开销很大,等应用程序结束时自然关闭

2.1.2 session(重点)

一个线程不安全的多例的轻量级对象。
session的获取
sessoinFactory.openSession() //创建一个新的session,可以不在事务内执行,无需注册,必须手工关闭session
sessionFactory.getCurrentSession()//获取当前进程的session对象, 查询必须再事务内执行,需要注册session的运行环境,自动关闭 session的CURD 这里借鉴这个:

https://www.cnblogs.com/MindMrWang/p/8143984.html

3.1.1 hibernate常用的内置主键生成策略

      (1)increment生成策略
该策略是hibernate自己在维护主键的值。当准备在数据库表中插入一条新记录时,首先从数据库表中获取当前主键字段的最大值,然后在最大值的基础上加1,作为新插入记录的主键值。
用其生成的主键字段对应的属性类型可以使long,short,int及其封装的类型,在高并发下不能使用。(看来用处不大)
(2)identity
该策略使用数据库自身的自增长来维护主键值
(3)sequence
(4)native
他可以根据使用的数据库来选择一种方式(identity或者sequence)
(5)UUID(需要知道了解,会用)通过算法生成的ID全球唯一。但是生成的是32位长度的字符串(按字符来说)占内存

4.1持久对象状态管理

         1.对象状态:一般是指对象的一组属性的值(用于存放对象的存储介质有三个:普通内存,session缓存,数据库)
(1) 瞬时态:transit状态,对象在内存中存在,但DB中无记录,与session无关,是个过度的状态
(2)持久态:persistent状态,在内存中存在,DB中有记录,与session相关,在session中有对象的副本
(3) 游离态:detached状态,在内存中存在,在DB中有记录,与session无关。
(4) 无名态:在内存中不存在,但在DB中有记录,与session无关。
2.状态转换图

5.1.1单表查询(HQL语句)

         1.Query接口   hibernate进行HQL查询的接口,支持动态绑定的功能。使用session对象的createQuery方法可以获取Query对象。(HQL是面向对象的查询语言)
2.SQLQuery接口
3.Criteria接口

5.1.2HQL的动态参数赋值(在Query查询时:setInteger()等方法已过时)

                   参考这里的:

https://blog.csdn.net/m0_37922841/article/details/80560127

@Test
public void test03_1() { //动态参数赋值 Session session = HbnUtils.getSession();
try {
//开启事务
session.beginTransaction();
//执行操作 String hql="from Student where age>?0 and score<?1";//hql是面向对象的,这里的Student是类名,并且这里并不需要封装直接就是对象
Query query=session.createQuery(hql);
query.setParameter(0, 27);
query.setParameter(1, 21.0);
List<Student> list = query.list();
for(Student student : list) {
System.out.println(student);
}
//事务提交
session.getTransaction().commit();
} catch (Exception e) {
e.printStackTrace();
//事务回滚
session.getTransaction().rollback();
}
}
@Test
public void test03_2() { //动态参数赋值,别名的方式 Session session = HbnUtils.getSession();
try {
//开启事务
session.beginTransaction();
//执行操作 String hql="from Student where age>:age and score<:score";//hql是面向对象的,这里的Student是类名,并且这里并不需要封装直接就是对象
Query query=session.createQuery(hql);
query.setParameter("age", 27);
query.setParameter("score", 21.0);
List<Student> list = query.list();
for(Student student : list) {
System.out.println(student);
}
//事务提交
session.getTransaction().commit();
} catch (Exception e) {
e.printStackTrace();
//事务回滚
session.getTransaction().rollback();
}
}

6.1 关联关系映射

         1.什么是关联关系映射:关联映射是将数据库中的表映射成与之相对应的对象,当你对这个对象进行操作的时候,Hibernate会对数据库中对应的表执行相应的操作,你对该实体的操作实际上就是在间接的操作数据库中与之相对应的表。

hibernate的开始的更多相关文章

  1. hibernate多对多关联映射

    关联是类(类的实例)之间的关系,表示有意义和值得关注的连接. 本系列将介绍Hibernate中主要的几种关联映射 Hibernate一对一主键单向关联Hibernate一对一主键双向关联Hiberna ...

  2. 解决 Springboot Unable to build Hibernate SessionFactory @Column命名不起作用

    问题: Springboot启动报错: Caused by: org.springframework.beans.factory.BeanCreationException: Error creati ...

  3. hibernate多对一双向关联

    关联是类(类的实例)之间的关系,表示有意义和值得关注的连接. 本系列将介绍Hibernate中主要的几种关联映射 Hibernate一对一主键单向关联Hibernate一对一主键双向关联Hiberna ...

  4. Hibernate中事务的隔离级别设置

    Hibernate中事务的隔离级别,如下方法分别为1/2/4/8. 在Hibernate配置文件中设置,设置代码如下

  5. Hibernate中事务声明

    Hibernate中JDBC事务声明,在Hibernate配置文件中加入如下代码,不做声明Hibernate默认就是JDBC事务. 一个JDBC 不能跨越多个数据库. Hibernate中JTA事务声 ...

  6. spring applicationContext.xml和hibernate.cfg.xml设置

    applicationContext.xml配置 <?xml version="1.0" encoding="UTF-8"?> <beans ...

  7. [原创]关于Hibernate中的级联操作以及懒加载

    Hibernate: 级联操作 一.简单的介绍 cascade和inverse (Employee – Department) Casade用来说明当对主对象进行某种操作时是否对其关联的从对象也作类似 ...

  8. hibernate的基本xml文件配置

    需要导入基本的包hibernate下的bin下的required和同bin下optional里的c3p0包下的所有jar文件,当然要导入mysql的驱动包了.下面需要注意的是hibernate的版本就 ...

  9. Maven搭建SpringMVC+Hibernate项目详解 【转】

    前言 今天复习一下SpringMVC+Hibernate的搭建,本来想着将Spring-Security权限控制框架也映入其中的,但是发现内容太多了,Spring-Security的就留在下一篇吧,这 ...

  10. 1.Hibernate简介

    1.框架简介: 定义:基于java语言开发的一套ORM框架: 优点:a.方便开发;           b.大大减少代码量;           c.性能稍高(不能与数据库高手相比,较一般数据库使用者 ...

随机推荐

  1. [ZZ] 如何在多版本anaconda python环境下转换spyder

    https://www.zhihu.com/people/alexwhu/answers 使用anaconda的话,可以参考以下步骤: 1.打开anaconda navigator,选择左侧的环境菜单 ...

  2. 2019年3月更新 技术分享 WPF基本界面制作

    1.制作流程1.在vs中建立一个wpf程序2.建立一个主页面(.cs)(注:C#程序每一个页面都由两个文件构成一个xaml一个cs,一个前端文件一个后台文件)3.在主页面中添加按钮,按钮中嵌入图片,这 ...

  3. 在已安装64位oracle的服务器安装32位客户端

    应用场景:服务器操作系统是win2012 64位,原先安装了64位oracle12,后来系统增加导入excel的功能,网站必须启用32位兼容模式,这时候发现原有的页面打不开,提示: 试图加载格式不正确 ...

  4. thinkphp框架 的 链接数据库和操作数据

    框架有时会用到数据库的内容,在"ThinkPhp框架知识"的那篇随笔中提到过,现在这篇随笔详细的描述下. 一.链接数据库 (1)找到模块文件夹中的Conf文件夹,然后进行编写con ...

  5. 20175236 2018-2019-2 《Java程序设计》第三周学习总结

    教材学习内容总结 类与对象 类与对象的关系:要产生对象必须先定义类,类是对象的设计图,对象是类的实例 类:class是关键字,用来定义类. 类声明:例如class People. 对象的声明:类的名字 ...

  6. python css选择器

    css 选择器 <!DOCTYPE html> <html lang="en"> <head> <meta charset="U ...

  7. Retrofit 下载网络图片 保存到本地

    private void downImage(String imagePath) { try { CommonV2Api.downloadFile(mContext, imagePath, new I ...

  8. centos7部署.net core2.1

    1.centos 7.0及以上服务器 2..NET SDK 安装 2.1 安装 https://www.microsoft.com/net/download/linux-package-manager ...

  9. 用自己的话简要阐述struts2的执行流程

    Struts 2框架本身大致可以分为3个部分:核心控制器FilterDispatcher.业务控制器Action和用户实现的企业业务逻辑组件.核心控制器FilterDispatcher是Struts ...

  10. mpvue

    使用mpvue开发小程序 首先安装 我们使用@vue/cli 无法使用vue init 可以全局安装一个@vue/cli-init npm install -g @vue/cli-init 然后初始化 ...