OID,主键生成策略,PO VO DTO,get和load区别,脏检查,快照,java对象的三种状态

时间:2023-12-30 11:08:50

主键生成策略

sequence 数据库端

native 数据库端

uuid  程序端 自动赋值 生成的是一个32位的16进制数  实体类需把ID改成String 类型

assigned  程序端 需手动给值

<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> <hibernate-mapping package="entity">
<class name="Student" table="Student">
<id name="id" type="int" column="id">
<generator class="uuid"></generator>
</id>
<property name="name" type="string" column="name"/>
<property name="age" type="int" column="age"/>
</class>
</hibernate-mapping>

2. load()和gat()的区别

Load()没有使用对象的其他属性的时候,没有SQL 延迟加载  因为代理对象的出现 才导致延迟加载。

OID,主键生成策略,PO VO DTO,get和load区别,脏检查,快照,java对象的三种状态

OID,主键生成策略,PO VO DTO,get和load区别,脏检查,快照,java对象的三种状态

  

Get()没有使用对象的其他属性的时候,也生成了SQL 立即加载

OID,主键生成策略,PO VO DTO,get和load区别,脏检查,快照,java对象的三种状态

OID,主键生成策略,PO VO DTO,get和load区别,脏检查,快照,java对象的三种状态

 java对象的三种状态

持久态

Student stu=new Student();
Session.save(stu);
Session有的,DB中也会有。

游离态

stu.setId(1);
手里有OID,但是DB中没有
DB中,session没有的瞬时态

瞬时态

Student stu=new Student

体现:在session中以及DB都没有

脏检查(如图所示)

OID,主键生成策略,PO VO DTO,get和load区别,脏检查,快照,java对象的三种状态

脏检查及刷新缓存机制

脏检查:当事务提交时,Hiberante会对Session中持久状态的对象进行检测,判断对象的数据是否发生了改变

依据:

为什么要进行脏检查?

解析:如果对象发生了改变,就需要将改变更新到数据库中,以确保内存中的对象与数据库中的数据保持一致。

如何脏检查?

 解析:当一个Dept对象被加入到Session缓存(有人又称为 一级缓存  后者是内部缓存)中时,Session会为Dept对象的值类型的属性复制一份快照。

当Session刷新缓存时,会先进行脏检查,即比较Dept对象的当前属性与它的快照,来判断Dept对象的属性是否发生了变化。

如果发生了变化,Session会根据脏对象的最新属性值来执行相关的SQL语句,将变化更新到数据库中。

Session具有一个缓存,可以管理和跟踪所有持久化对象,对象和数据库中的相关记录对应。