Hibernate笔记(二)主键生成策略、缓存、事务操作、关于查询的api

本文深入讲解Hibernate框架的实体类编写规则、主键生成策略、实体类操作、对象状态管理、缓存机制及事务处理等内容,旨在帮助开发者全面掌握Hibernate的核心功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

hibernate-day02

1.实体类编写规则

1.实体类的属性要是私有的

2.私有属性使用公开的set,get方法操作

3.要求实体类有属性作为唯一值(一般用id)

4.实体类属性建议不使用基本数据类型,而是使用包装类

(1)八个基本数据类型对应包装类

int-Integer char-Character …等等

2hibernate主键生成策略

hibernate要求实体类里面有一个属性作为唯一值,

hibernate主键生成策略有很多值:
increment
用于long、short、 或int类型,由Hibernate 自动以递增的方式生
成唯一标识符,每次增量为1。只有当没有其它进程向同一张表中插入
数据时才可以使用,不能在集群环境下使用。适用于代理主键。
identity
采用底层数据库本身提供的主键生成标识符,条件是数据库支持
自动增长数据类型。在DB2、MySQL、MS SQL Server、 Sybase 和
HypersonicSQL数据库中可以使用该生成器,该生成器要求在数据库中
把主键定义成为自增长类型。适用于代理主键。
sequence
Hibernate根据底层数据库序列生成标识符。条件是数据库支持序
列。适用于代理主键。
native
根据底层数据库对自动生成表示符的能力来选择identity 、
sequence、hilo 三种生成器中的-种,适合跨数据库平台开发。适用于
代理主键。
uuid
Hibernate采用128位的UUID算法来生成标识符。该算法能够在
网络环境中生成唯一的字符串标识符,其UUID被编码为一一个长度为
32位的十六进制字符串。这种策略并不流行,因为字符串类型的主键
比整数类型的主键占用更多的数据库空间。适用于代理主键。
assigned
由java程序负责生成标识符,如果不指定id元素的generator属性,
则默认使用该主键生成策略。适用于自然主键。

生成策略值 uuid

(1)使用uuid生成策略,实体类id属性类型 必须 字符串类型

3.实体类操作

(1)crud

添加操作:

  User user = new User();
        user.setUname("小脑斧");
        user.setAddress("河南省南阳市西峡县");
        user.setPassword("zahzha");
        session.save(user);

通过id查询

 //第四步通过id查询
        User user = session.get(User.class, 1);
        System.out.println(user);

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4Hg9u9Zr-1597127787721)(file:///C:\Users\Lenovo\AppData\Roaming\Tencent\Users\1605367528\QQ\WinTemp\RichOle{NV26CV%MWX@N%[EMW$~{}8.png)]

更新操作

首先要先查询再修改,先通过id查询之后再进行修改

 User user = session.get(User.class, 1);
       System.out.println(user);

       //查完再改
       user.setUname("张小娴");
       user.setAddress("郑州市");
       session.update(user);

在这里插入图片描述

删除操作

在这里插入图片描述

3 实体类对象状态

实体类对象有三种状态

瞬时态
对象里面没有id,对象与session也没有关系
在这里插入图片描述

2,持久态、
对象里面有id ,对象与sassion有关系
在这里插入图片描述

托管态
对象有id ,但是对象与session没关系
在这里插入图片描述saveOrUpdate()方法
在这里插入图片描述在这里插入图片描述在这里插入图片描述

4.hibernate的一级缓存

缓存:

1 数据存到数据库里面,数据库本身是文件系统,使用流方式操作文件效率不是很高。
(1)把数据存到内存里面,不需要使用流方式,可以直接读取内存中数据
(2)把数据放到内存中,提供读取效率

hibernate缓存

1 hibernate框架中提供很多优化方式,hibernate的缓存就是一个优化方式

2 hibernate缓存特点:
第一类 hibernate的一级缓存
(1)hibernate的一级缓存默认打开的
(2)hibernate的一级缓存使用范围,是session范围,从session创建到session关闭范围
(3)hibernate的一级缓存中,存储数据必须 持久态数据

第二类 hibernate的二级缓存
(1)目前已经不使用了,替代技术 redis
(2)二级缓存默认不是打开的,需要配置
(3)二级缓存使用范围,是sessionFactory范围

验证一级缓存存在

1 验证方式
(1)首先根据uid=1查询,返回对象
(2)其次再根据uid=1查询,返回对象
在这里插入图片描述
第一步执行get方法之后,发送sql语句查询数据库
第二个执行get方法之后,没有发送sql语句,查询一级缓存内容
在这里插入图片描述

一级缓存执行过程

在这里插入图片描述在这里插入图片描述

5.hibernate的事务操作

(1)事务代码的书写规范

事务相关概念

1 什么是事务

在数据库操作中,-项事务(Transaction) 是由- -条或多条操作数据库的SQL语句组成的一一个
不可分割的工作单元。当事务中的所有操作都正常完成时,整个事务才能被提交到数据库中,如果
有一项操作没有完成,则整个事务会被回滚。
其实事务总结起来理解为:逻辑上的一组操作,组成这组操作的各个单元,要么一起成功,要
么一起失败。

2 事务特性

ACID原则,原子性,一致性,隔离性,持久性
在这里插入图片描述

3 不考虑隔离性产生问题(事务的并发问题)

(1)脏读 一个事务读取到另一个未提交的事务
(2)不可重复读 一个事务读取到另一个已经提交的update的数据,导致多次查询结果不一样
(3)虚读 一个事务读取到另一个事务已经insert的事务的数据,导致多次查询的结果不同

4 设置事务隔离级别

(1)mysql默认隔离级别 repeatable read
Hibernate事务代码规范写法
1 代码结构
try {
开启事务
提交事务
}catch() {
回滚事务
}finally {
关闭
}

@Test
	public void testTx() {
		SessionFactory sessionFactory = null;
		Session session = null;
		Transaction tx = null;
		try {
			sessionFactory = HibernateUtils.getSessionFactory();
			session = sessionFactory.openSession();
			//开启事务
			tx = session.beginTransaction();
			
			//添加
			User user = new User();
			user.setUsername("小马");
			user.setPassword("250");
			user.setAddress("美国");
			
			session.save(user);
			
			int i = 10/0;
			//提交事务
			tx.commit();
		}catch(Exception e) {
			e.printStackTrace();
			//回滚事务
			tx.rollback();
		}finally {
			//关闭操作
			session.close();
			sessionFactory.close();
		}
	}

Hibernate绑定session

1 session类似于jdbc的connection,之前web阶段学过 ThreadLocal
在这里插入图片描述
2 帮实现与本地线程绑定session

3 获取与本地线程session
(1)在hibernate核心配置文件中配置
在这里插入图片描述
(2)调用sessionFactory里面的方法得到
在这里插入图片描述

4 获取与本地线程绑定session时候,关闭session报错,不需要手动关闭了在这里插入图片描述

6.hibernate的其他api(查询)

(1)Query

1 使用query对象,不需要写sql语句,但是写hql语句
(1)hql:hibernate query language,hibernate提供查询语言,这个hql语句和普通sql语句很相似
(2)hql和sql语句区别:

  • 使用sql操作表和表字段
  • 使用hql操作实体类和属性

2 查询所有hql语句:
(1)from 实体类名称

3 Query对象使用
(1)创建Query对象
(2)调用query对象里面的方法得到结果

 @Test
   public void test(){
        try{
        //与本地绑定的session
            sessionFactory =HibernateUtil.getSessionFactory();
        session=    HibernateUtil.getSessionObject();
        transaction=session.beginTransaction();

        //创建Query对象
            Query query = session.createQuery("from User");

            //第二步调用query对象  得到结果
            List<User> list = query.list();
            for (User user : list) {
                System.out.println(user);
            }
//提交
            transaction.commit();
        }catch (Exception e){
            e.printStackTrace();
            //回滚
            transaction.rollback();
        }finally {
            session.close();
            sessionFactory.close();
        }
    }

(2)Criteria

1 使用这个对象查询操作,但是使用这个对象时候,不需要写语句,直接调用方法实现

2 实现过程
(1)创建criteria对象
(2)调用对象里面的方法得到结果
在这里插入图片描述

(3)SQLQuery

1 使用hibernate时候,调用底层sql实现

2 实现过程
(1)创建对象
(2)调用对象的方法得到结果

返回list集合每部分是数组
在这里插入图片描述
返回list中每部分是对象形式

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值