Hibernate(sql语句执行时机,类级别延迟加载,对象三种状态,一级缓存)

sql语句执行时机
1.hibernate 会自动生成sql语句,并且发送给数据库执行;
当hibernate 执行save(),get()时是立即执行,生成sql语句,当执行update(),delete()时,会在事物提交的时候才执行。
2. oid(Object id)就是一个属性,只不过这个属性映射到表中,对应的是主键列!
3. sql语句执行时机,默认情况下是:
从没有oid到有oid,就会立即执行
从有oid到有oid,就会在事务提交时才执行.
4. 无论oid是从有到有,还是无到有,只要执行了s.flush();统统都会立即执行sql语句!
类级别的延迟加载
1.get时,会立即执行sql语句,所以get是立即加载;
2.load也会加载数据,但只有访问了对象的非oid属性时,才执行sql语句;
3.当查询的对象不存在时,get会返回null,而load会报错
4.get得到的是真是对象,而load得到的是代理对象(load方法得到的代理类其实是真实类的子类)
禁用延迟加载方法1:就是让 User 类不能被继承
禁用延迟加载方法2:修改User.hbm.xml中的class元素添加一个lazy=”false”
对象的三种状态
1.被session管理的途径: get save update saveOrUpdate
被session取消管理的途径: session.delete(); session.evict(); session.clear(); session.close();
让一个对象与数据库中有对应记录的途径:oid与表中某行id一致

2.临时状态
    不在session管理之中,在数据库中没有对应记录
    对对象的任何修改,不会影响数据库
3.游离状态
    在session管理之中,在数据库中没有对应记录 
    对对象的任何修改,不会影响数据库
4.持久化状态
    在session管理之中,在数据库中有对应记录
对对象的任何修改,都会直接更新到数据库 

持久化状态对象
处于持久化状态的对象,是被session管理的,也就是说持久化的对象会在session的内存中有一个备份,(snapshot快照),每次把这个备份修改了,就会根据这个备份对象的属性同步映射到数据库。
(1)、快照是数据的副本
(2)、快照属于一级缓存
(3)、快照是在堆内存中的
(4)、快照的作用:保证数据一致性
当执行`session.getTransaction().commit()时,Hibernate同时会清理session的一级缓存(flush),也就是将堆内存中的数据与快照中的数据进行对比,如果不一致,则会执行同步(update)操作,若相同,则不执行update。
一级缓存
1.hibernate查询对象时,如果找到对象了,则会将找到的对象缓存进session对象中(一个Map中)
多次获取同一个能找到的对象时,会生成1个sql语句。
多次获取同一个不能找到的对象时,会生成多个sql语句。

2.一级缓存是Session级别的缓存,也就是说一级缓存不能跨Session

3.一级缓存伪代码演示
class Session {
        priavte Map map = new HashMap();
        ...
        public Object get(oid) {
            Object obj = map.get(oid);
            if(obj == null) {
                obj = "select * from user where uid = " + oid;          
                map.put(oid, obj);
            } 
            reutrn obj;
        }
        ...
    }
4.session.refresh(对象),强制session绕过缓存,直接去数据库中查询数据

你可能感兴趣的:(框架)