对象的三种状态: 瞬时态:对象刚刚创建,没有与session关联,没有ID 持久态:已经和Session关联,有ID 游离态:没有和session关联,有ID 瞬时=>持久 save/persist 瞬时=>游离 setId 持久=>游离 close/evict/clear 持久=>瞬时 close/evict/clear 再 将ID设置为null 游离=>瞬时 将ID设置为null 游离=>持久 update/saveOrUpdate 持久状态的特性:持久对象的所有变化,会被自动同步到数据库中。 一级缓存: Hibernate中有两种缓存:线程级别的session缓存 和 进程级别的sessionFactory缓存(不久就会学到啦) 在Session对象中,有一个缓存。 本质:Map集合、键是ID、值是对象,Hibernate会把所有查询到的对象,放入缓存中。 如果再次查询相同的对象,会先从缓存中找。目的:为了提高效率。 快照:快照是为了对比缓存中的对象是否发生变化,来决定事务提交时,是否需要修改数据。 其他api: evict(); 将缓存中的对象移除 clear(); 清空一级缓存 refresh(Object); 刷新 => 强制刷新缓存中的对象 => (可以用来解决缓存与数据库数据不同步的问题(局部解决)) flush(); 对比快照,并提交缓存对象 saveOrUpdate(Object); 可以同时完成保存或更新操作 save/persist HQL/SQL/Criteria与缓存的关系 => 查询到的对象会放入缓存中,但是每次查询都要发送sql语句。
一对多的表达: 在数据库表中如何表达一对多关系:在多的一方的表中加入外键,引用的是一的一方的主键。 在对象中如何表达一对多关系:在一的一方使用集合表达持有多的一方,在多的一方引用一的一方的对象。 在配置文件中如何表达一对多关系: 一方: <set name="一的一方属性的集合名称" > <key column="多的一方的外键名称" /> <one-to-many class="多的一方所属对象的完整类名" /> </set> 多方: <many-to-one name="多的一方属性的引用名称" column="多的一方的外键名称" class="一的一方所属对象的完整类名" /> 一对多的操作: inverse:一的一方要不要放弃维护外键关系,默认值是:false cascade:取值有: save-update 级联保存和级联修改 delete 级联删除 delete-orphan 孤儿删除 all save-update + delete all-delete-orphan save-update + delete + delete-orphan