【hibernate】状态、一级缓存、快照及加载策略

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

猜你喜欢

转载自blog.csdn.net/qq_40979551/article/details/83313088