一、什么是持久化
持久化:把内存中的数据存储到数据库(数据库是硬盘上的文件)中
二、什么是持久化类
持久化类:Java类(class)和数据库中表存在映射关系(class名.hbm.xml)
三、Hibernate的持久化类的编写规则
无参数构造(用于反射实例化对象)
属性私有,提供get、set方法
属性尽量使用包装类(Interg、Long...,包装类类型默认值为null)
提供一个唯一OID与主键对应(Java中通过对象地址区分是否为同一对象,数据库通过主键区分是否为同一记录,Hibernate通过持久化类的OID的属性区分是否为同一对象)
不要使用final修饰(用于使用代理对象)
四、Hibernate 持久化类三种状态
①、瞬时态:没有唯一标识OID,没有被session管理
②、持久态:有唯一标识OID,已经被session管理
③、脱管态:有唯一标识OID,没有被session管理
@Test public void demo2() { Session session=HibernateUtils.openSession(); Transaction transaction=session.beginTransaction(); Customer customer=new Customer();//瞬时态 customer.setCust_name("zhang"); session.save(customer);//持久态 transaction.commit(); session.close(); System.out.println(customer.getCust_name());//session.close();托管态 }
五、三种状态转换
①、瞬时态
获取
Customer customer=new Customer();
瞬时态=>持久态
Serializable save(Object obj)、saveOrUpdate(Object obj)
瞬时态=>托管态(本质:缺少OID)
Customer customer=new Customer(); customer.setCust_id(1l);
②、持久态
获取
get()、load()、find()、iterate()
Customer customer=session.get(Customer.class,1l);
持久态=>瞬时态
delete();
持久态=>托管态
close()、clear()、evict(Object obj)
③、托管态
获取
Customer customer=new Customer(); customer.setCust_id(1l);
托管态=>持久态
update()、saveOrUpdate()
托管态=>瞬时态
customer.setCust_id(null);
六、持久态对象自动更新数据库
@Test public void demo6() { Session session=HibernateUtils.openSession(); Transaction transaction=session.beginTransaction(); //获取持久态对象 Customer customer=session.get(Customer.class, 2l); customer.setCust_name("zhao"); //session.update(customer);//没有update transaction.commit(); session.close(); }
再次执行,数据没有变更的情况下不会更新
自动更新数据的底层原理是:Hibernate的一级缓存
七、Hibernate缓存
缓存:一种优化方式,将数据存储在内存中,获取数据直接从内存中读取,不需要读取硬盘
Hibernate框架中提供了优化方式:缓存、抓取策略。
Hibernate中提供了二种缓存机制:一级缓存、二级缓存。
Hibernate一级缓存:是Session缓存,一级缓存生命周期与Session一致,一级缓存是自带的不可卸载。
一级缓存:是由Session中一系列Java集合构成的,默认开启
二级缓存:是SessionFactory级别的缓存,需要配置的缓存,默认不开启
在使用Hibernate查询对象时,首先会使用对象属性的OID值在Hibernate的一级缓存中查找,如果找到匹配OID的对象,将直接从一级缓存中取出使用,不会查询数据库,如果没找到匹配OID的对象,则查询数据库。
HIbernate一级缓存作用:减少对数据库的访问次数
HIbernate一级缓存特点:
①、调用Session接口的save()、update()、saveOrUpdate()时,缓存中没有相应对象,自动从数据库中查询到相应信息加入到缓存中。
②、调用Session接口的load()、get()方法,以及Query接口的list()、iterator()方法时,判断缓存中是否存在该对象,有则返回,不会查询数据库,没有则查询数据库,并添加到一级缓存中。
③、Session的close()方法,Session缓存清空。
证明一级缓存存在:
@Test public void demo() { Session session=HibernateUtils.openSession(); Transaction transaction=session.beginTransaction(); /* * Customer customer1=session.get(Customer.class, 2l);//发送SQL * System.out.println(customer1); * Customer customer3=session.get(Customer.class, 3l);//不发送 * SQL System.out.println(customer3); */ Customer customer=new Customer(); customer.setCust_name("zhao"); Serializable id=session.save(customer);//发送SQL Customer customer2=session.get(Customer.class, id);//不发送SQL System.out.println(customer2); transaction.commit(); session.close(); }
一级缓存的快照区:当一个持久化类设置属性值,缓存区数据会重新保存,当事务提交时,缓存区数据和快照区的数据比较,不一致时,自动更新数据,一致时,就不更新数据