Hibernate 加载策略
1. 对象的三种状态(hibernate管理的对象)
1.1 临时状态
1.2 持久状态
1.3 游离状态
1、hibernate是通过管理对象来操作数据,这里对象指的是持久化对象。
2、hibernate中的三种状态的对象是可以相互转换的,通常编码时只关注持久
化对象。关注get、save、update方法所操作后的对象
2. 一级缓存、快照(orm特性)
在Session中定义了一系列的集合来存储数据,它们构成了Session的缓存。只要Session没有关闭,它就会一直存在。当我们通过Hibernate中的Session提供的一些API例如save()、get()、update()等进行操作时,就会将持久化对象保存到Session中,当下一次再去查询缓存中具有的对象(通过OID值来判断),就不会去从数据库中查询了,而是直接从缓存中获取。Hibernate的一级缓存存在的目的就是为了减少对数据库的访问。
当然了,在Hibernate中还有一个二级缓存,它是SessionFactory级别缓存
3. 加载策略
3.1 立即加载
3.2 延迟加载
- 01.类级别的查询策略
- 02.一对多和多对多关联的查询策略
- 03.多对一关联的查询策略
- 02.一对多和多对多关联的查询策略
什么时候使用延迟加载
如果程序加载一个对象的目的是为了访问它的属性,可以采用立即加载。如果程序加载一个持久化对象的目的是仅仅为了获得它的引用,可以采用延迟加载。
什么是懒加载
1,hibernate3以上,所有的关系查询都是使用懒加载的策略
* 什么时懒加载的策略?
* 在调用sesseion会话的数据库操作的方法时,并不会之间生成sql语句去操作数据库,而是先
* 创建一个代理对象,将oid(object id) 存放到session的代理对象中,当具体的要用到持久化对象
* 的时候,才会生成sql语句进行查询。
4. 并发控制
如果两个人一起操作一条数据,那么会出现有一个人已经修改成功了,另外一个的数据没有发生改变,但他们的结果全部已经改变了,就出现了一个延时的Bug。我们可以在数据库里面加一列,integer类型来控制数据的改变。