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

主键生成策略

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 延迟加载  因为代理对象的出现 才导致延迟加载。

 

 

   

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

 java对象的三种状态

持久态

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

游离态

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

 

瞬时态

Student stu=new Student

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

 

脏检查(如图所示)

脏检查及刷新缓存机制

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

   依据:

   为什么要进行脏检查?

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

   如何脏检查?

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

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

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

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

 

posted @ 2016-08-29 14:12  李泽阳  阅读(501)  评论(0编辑  收藏  举报