1.hibernate管理的对象的三种状态(临时状态,持久状态,游离状态)
Tips:
①:hibernate是通过管理对象来操作数据的,这里指的值持久化对象。
②:hibernate中的三种状态的对象是可以相互转换的,通常编码时只关注持久化对象。关注get,save,update方法操作后的对象。
2:一级缓存、快照(orm特性)
Configuration cfg = new Configuration().configure("hibernate.cfg.xml");
SessionFactory sessionFactory = cfg.buildSessionFactory();
Session session = sessionFactory.openSession();
Transaction transaction = session.beginTransaction();
User user = session.get(User.class, 3);
System.out.println(user.getRealName());
user.setRealName("翔");
transaction.commit();
session.close();
以上并没执行修改方法,却修改了,为什么?
所谓一级缓存其实就是session级别的缓存
* 1、用户第一次访问数据,拿到一条数据,它将数据形成一个快照保存到session会话中,
* 并且利用反射机制将值封装进实体类中。
* 2、当封装好的持久化对象里面的属性值发生改变时,它会与session中得快照进行对比,
* 如果不一致,会进行修改
3.加载策略
1.立即加载
直接生成sql语句去操作数据库
2.延迟加载(懒加载)【hibernate3以上,所有的关系查询都是使用懒加载的策略】
在调用session会话的数据库操作是,并不会直接生成sql语句去操作数据库,而是先创建一个代理对象,将oid(object id)存放到session的代理对象中,当具体的要用到持久化的对象之后, 才会生成sql语句进行查询
4:并发控制(加一列去控制)
eg:例如用户a和用户b同时修改同一信息,我们该如何处理?
方案:加一列 (version)
修改语句:
update t_student set sname='aaa1', version=version+1
where sid = 8 and version=0