Hibernate知识点小结(二)

一、持久化对象和标识符
    1、持久化类
        配置完关系后,操作的实体对应的类,成为持久化类 (Customer)

2、持久化类标识符(oid:object id)
    
    3、持久化类主键的生成策略
        <id name="cust_id">
            <generator class="native"></generator>        
        </id>
        generator的class属性的取值:
        
        数据库底层生成主键:
            identity:底层以自增的方式生成主键 例如mysql
            sequence:底层以序列方式生成主键 例如oracle
            native:根据数据库底层的主键生成策略自动选用identity还是sequence (使用最多)
        hibernate生成主键:
            increment:自增
            uuid:生成不重复的字符串        
        手动指定主键:
            assigned
           
        代理主键:没有实际业务意义的字段
        自然主键:可以具备主键的要求(唯一不空) 与此同时还具备业务意义(身份证、手机号、学号....)
            
        
二、hibernate持久化对象的三种状态 和 一级缓存
    1、持久化对象的三种状态
        瞬时态:实体没有oid 也与session没有关联
        持久态:实体有oid 与session有关联
        脱管态:实体有oid 与session失去关联
        
        代码演示:
            Session session = HibernateUtils.openSession();
            Transaction transaction = session.beginTransaction();
            
            Customer customer = new Customer(); //瞬时态
            customer.setCust_name("jd"); //瞬时态
            System.out.println(customer); //瞬时态
            session.save(customer); //执行完毕后 持久态
            System.out.println(customer); //持久态
            
            transaction.commit(); //持久态
            session.close(); //脱管态
            
            System.out.println(customer);  //脱管态
            
    2、hibernate的一级缓存(重点)
        hibernate存在两级缓存:
            一级缓存:hibernate的内置缓存,session级别的缓存
            二级缓存:hibernate的外置缓存,sessionFactory级别缓存  
            
        验证一级缓存是存在的?
            Session session = HibernateUtils.openSession();
            Transaction transaction = session.beginTransaction();
            //查询对象
            Customer customer = session.get(Customer.class, 4L);//发送sql查询数据 封装Customer  将customer缓存在session中
            Customer customer2 = session.get(Customer.class, 4L);//从session获取4号customer
            System.out.println(customer);
            System.out.println(customer2);
            transaction.commit();
            session.close();
            
        持久态对象具备自动发送sql的能力
        为什么持久态对象可以自动发送sql?一级缓存内部存在快照区
        

三、事务相关
    1、事务的特性ACID
        原子性:事务是数据库操作最小单位 不可再分割
        一致性:同时成功或同时失败
        隔离性:多个事务互不影响的
        持久性:当事务提交 数据就会被持久化到磁盘上
    
    2、并发操作出现的问题
        脏读:A事务读取到B事务尚未提交的数据(最不安全的 开发中必须要避免的)
        不可重复读:一个事务中多次读取数据的内容不一致
        虚读/幻读:一个事务中多次读取数据的条数不一致
        
    3、设置数据库的隔离级别(isolation)解决并发问题
        read uncommitted: 都不能解决  没人用
        read committed:解决脏读    oracle的默认隔离级别
        repeatabel read:解决不可重复读和脏读     mysql的默认隔离级别
        serializable:都能解决  性能很低
        
    4、hibernate与事务相关的配置
        1、session与线程绑定
            作用:业务层使用session控制事务  dao层使用同一个session进行实体操作
            <property name="hibernate.current_session_context_class">thread</property>
            
        2、hibernate可以配置隔离级别
            <property name="hibernate.connection.isolation">1/2/4/8</property>
            //十六进制数
            read uncommitted: 1   0001
            read committed:2      0010
            repeatabel read:4      0100
            serializable:8       1000

四、hibernate的查询操作(重点)
    hibernate的查询方式:5种
    1、oid方式        get/load方法
    2、对象导航方式
    3、HQL方式        Hibernate Query Language    面向对象+结构化查询   (重点)
    4、QBC方式        Query By Criteria            完全面向对象的(api)
    5、SQL方式        通过sql语句查询

原文地址:https://www.cnblogs.com/itworkerlittlewrite/p/9448062.html

时间: 2024-08-01 01:53:25

Hibernate知识点小结(二)的相关文章

Hibernate知识点小结(四)--JPA

一.jpa的简介和入门 JPA:Java Persistence API,接口规范    Hinernate内部为JPA规范提供实现        开发步骤(EntityManager):        1.导入额外包:hibernate-release-5.0.7.Final\lib\jpa\hibernate-entitymanager-5.0.7.Final.jar        2.使用jpa注解配置实体(实体与表的映射关系)        3.配置EneityManager的核心配置文

Spring知识点小结(二)

一.配置非自定义的Bean(数据源DataSource模型) DBCP数据源:        导入dbcp的jar包:dbcp+pool+connector                代码实现:            //创建数据源对象            BasicDataSource dataSource = new BasicDataSource();            //设置数据库的基本参数            dataSource.setDriverClassName("

C++知识点小结 (二)

一.拷贝构造函数 1.是一种特殊的构造函数,就是用一个已有的对象去构造其同类的副本对象,即对象克隆 class 类名 { 类名(类名& that) { 对成员挨个赋值 } } 2.编译器会默认生成一个拷贝构造函数 编译生成的拷贝构造函数默认会逐字节复制类中的每一个成员 如果在类A中有类B成员,会在类A的拷贝构造中自动调用类B的拷贝构造 3.程序员可以自定义拷贝构造来取代默认的拷贝构造 a.拷贝构造只能有一个,不能重载 b.一旦程序员自定义的拷贝构造,编译器就不再生成 c.在自定义的拷贝中能通过编

Hibernate知识点复习之二

Hibernate学习之二 一 Hibernate持久化类 1 什么是持久化类? Hibernate是持久层ORM映射框架, 专注于数据的持久化 ,所谓的持久化 就是将内存中的数据永久存储到关系型数据库的过程. 而持久化类就是 通过映射文件与数据库建立起映射关系的Java类. 2 持久化类的编写规则: 1. 需提供无参构造方法.(Hibernate底层是通过反射技术生成持久类的实例) 2. 类属性需私有化, 提供私有的getter和setter方法.(Hibernate底层将查询到数据通过get

oracle事务知识点小结

DML语句流程 1 获取事务锁和ITL2 锁定候选行3 生成redo4 生成undo5 生成redo record写入log buffer并更改数据块 事务提交1 分配SCN2 更新事务表,将事务槽状态改为0x093 回收undo块4 创建commit redo record5 将redo从log buffer刷新6 释放表锁和行锁 锁一个事务由1个TX和若干TM组成,而回滚savepoint不会释放TX锁: ITL通过XID指向事务槽,进而指向undo记录,其UBA也指向undo记录:两者区别

javascript 学习小结 (二) by FungLeo

javascript 学习小结 (二) by FungLeo 前言 前面写过一个学习小结javascript 学习小结 JS装逼技巧(一) by FungLeo 那篇博文总结的东西还是比较多的. 但是JS有很多的内容,都是很有用的知识点,不可能一下子记住.因此,我的学习小结的会一直更新. 因为学习进度的不同,可能每篇博文的长短也不一样,有的学的东西多,就长点. 查询某个字符串在某个数组中的索引值 笨方法 我的基础比较差,所以很多东西是记不住的.因此,我在需要这样做的时候,我写了如下代码 var

Hibernate知识点复习之三

HIbernate知识点复习之三 案例需求描述: 存在着一个客户对应多个联系人的情况,单独在联系人管理模块中对联系人信息进行维护,功能包括: 对联系人信息进行增删改查 表关系分析: 一 概述:数据库中多表之间存在着三种关系:一对一 一对多 多对多 ,这也是系统设计中三种实体关系.二 建表原则1 一对多:在多的一方 创建外键指向一得一方的主键2 多对多:创建一个中间表,中间表里创建至少两个字段作为外键,分别指向多对多双方的主键3 一对一:(1)主键对应:一方主键作为另一方主键(2)唯一外键:一方创

SpringBoot 系列教程之事务隔离级别知识点小结

SpringBoot 系列教程之事务隔离级别知识点小结 上一篇博文介绍了声明式事务@Transactional的简单使用姿势,最文章的最后给出了这个注解的多个属性,本文将着重放在事务隔离级别的知识点上,并通过实例演示不同的事务隔离级别下,脏读.不可重复读.幻读的具体场景 I. 基础知识 在进入正文之前,先介绍一下事务隔离级别的一些基础知识点,详细内容,推荐参考博文 mysql 之锁与事务 1. 基本概念 以下基本概念源于个人理解之后,通过简单的 case 进行描述,如有问题,欢迎拍砖 更新丢失

琐碎的知识点(二)

1.绑定设置时间格式 <%#Eval("time", "{0:yyyy-MM-dd}")%> <%#DateTime.Parse(Eval("time").ToString()).ToString("yyyy-MM-dd")%> 2.Repeater1.Items.Count 是指Repeter1的数据绑定条数 <%#this.rptnewstraining.Items.Count == 0 ?