package xinfei.code;
/**
* 一、持久化类的编写规范
* 什么是持久化类?
* 持久化类:和数据库表做了映射关系的类,我们就可以把这个类称之为持久化类
* hibernate对持久化类的要求规范:
* 1.需要提供一个无参的构造方法(hibernate是通过无参构造器来实例化对象的)
* 2.所有属性都要私有化
* 3.需要对外提供get/set方法
* 4.基本类型和包装类型,建议使用包装类型
* 5.持久化类不能被final修饰
* 如果修饰了会怎么样? 不能被继承
* 修饰的结果:延迟查询会变成立即查询
* 延迟查询解释:延迟查询是hibernate的一种优化手段
* ,如果暂时不需要使用这些数据的时候,就不连接数据库查询
* 如果被final修饰了当前的持久化类,就意味着我们的hibernate失去了延迟加载的优化手段
* 原因:get查询返回的是当前类型的对象;load查询返回的是代理对象
* 6.持久化类必须要有标识属性(OID属性)
* 什么是标识属性?
* a.只要一个类和数据库的一张表有了映射关系,我们就可以把这个类称为持久化类
* b.只要一个类中的某个属性和数据库表里面的主键做了映射关系,我们就可以把这个属性称为标识属性或OID
* 为什么必须要有标识属性呢?
* hibernate就是根据标识属性来区分多个对象是否是同一个对象
*
* 不同的技术用来区分多个对象是否为同一个
* a.jvm是通过判断内存地址值,b.数据库.是判断主键,c.hibernate判断oid
* 结论:持久化类中,必须要有oid属性,oid属性不能相同必须唯一
* 二、hibernate的一级缓存
* Hibernate的一级缓存就是指Session缓存,Ssesion缓存是一块内存空间,用来存放相互管理的java对象
* ,在使用Hibernate查询对象的时候,首先会使用对象属性的OID值在Hibernate的一级缓存中进行查找
* 如果找到匹配OID值得对象,就直接将该对象从一级缓存中取出使用,不会再查询数据库
* 如果没有找到相同OID值得对象,则回去数据库中查找相应数据,当数据库中查询到所需数据时,还该数据信息也会方法一级缓存中
* 一级缓存的作用:Hibernate的一级缓存的作用就是减小数据库的访问次数
* Hibernate的一级缓存有如下特点:
* 1. 当应用程序调用Session接口save()/update()时,如果Session缓存中没有
* 相应的对象,Hibernate就会自动的把数据库中查询的相应对象信息加入到一级缓存中
* 2.当调用Session接口的load()、get()方法,以及Query接口的list/iterator()方法
* 会判断缓存中是否存在该对象,有则返回,不会查询数据库,如果缓存中没有要查询的对象
* 再去数据库中查询对应对象,并添加到一级缓存中
* 3.当调用Session的close()方法时,Session缓存会被清空
* 对象的三种状态
* 1.瞬时态:瞬时态也称为临时态或者自由态,瞬时态的实例是由new创建、开辟内存空间的对象
* ,不存在持久化标识OID(相当于主键值),尚未与Hibernate Session关联,在数据库中也没有记录
* 瞬时态的对象在内存中是孤立存在的,与数据库中的数据无任何关联
* 2.持久态:持久态的对象存在持久化标识OID,加入到了Session缓存中,并且相关联的Session
* 没有关闭,在数据库中有相应的记录,每条记录只对应唯一的持久化对象,需要注意的是
* 持久化对象是在事物还未提交前变成持久态的
* 3.托管态:实例与Session的关联被关闭就变成了托管态
* @author zx
*
*/
public class text02 {
}