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. Go外包 Go语言外包 Golang外包商 浅谈Go的全局变量和生命周期

    最近做Go语言开发,有些心得分享下: Go语言全局var不同于PHP里的全局var,最大区别session 还是app,app 所有人都可以改.session自己改.不同过程之间通用   比如我php ...

  2. sql server 2005中的分区函数用法(partition by 字段)

    分组取TOP数据是T-SQL中的常用查询, 如学生信息管理系统中取出每个学科前3名的学生.这种查询在SQL Server 2005之前,写起来很繁琐,需要用到临时表关联查询才能取到.SQL Serve ...

  3. Ubuntu 15.10 下Redis Cluster使用

    1 Redis Standalone安装 可以参考这篇博文:http://www.cnblogs.com/_popc/p/3684835.html 2 Redis Cluster安装 2.1 环境介绍 ...

  4. Kafka基本命令

    1.创建自定义的topic 在bin目录下执行: sh kafka-topics.sh --create --zookeeper hadoop01:2181 --replication-factor ...

  5. ROS多根adsl叠加负载均衡PCC的做法

    命令行: / ip firewall mangle1.保证访问局域网IP的时候不被PCC了.add chain=prerouting dst-address=10.1.1.0/24 action=ac ...

  6. idea git commit撤销

    到项目目录下,打开git bash 1.git log 找到要撤销的版本id1 commit之前的版本id2 2.git reset –hard id13.git reset id2 参考链接:htt ...

  7. java中抽象类是否可以继承实体类?

    一道java 常见面试题,网上找到的几乎每个 java 面试笔试题大全或集锦里都能找到这道题. 题目如下:问: 抽象类是否可继承实体类 (concrete class) 答: 抽象类是可以继承实体类, ...

  8. Java中的transient关键字

    转载于:[lfsf802](http://blog.csdn.net/lfsf802/article/details/43239663) 关键字介绍 一个对象只要实现了Serilizable接口,这个 ...

  9. Java异常处理——如何跟踪异常的传播路径?

    当程序中出现异常时,JVM会依据方法调用顺序依次查找有关的错误处理程序. 可使用printStackTrace 和 getMessage方法了解异常发生的情况: printStackTrace:打印方 ...

  10. springboot学习一:快速搭建springboot项目

    1.idea创建springboot工程 JDK选择1.8以上的版本 选择springboot的版本和添加配置项 新建一个HelloController,测试 访问 http://localhost: ...