主键生成策略
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具有一个缓存,可以管理和跟踪所有持久化对象,对象和数据库中的相关记录对应。