hibernate框架02
1.持久类的编写:
实体类应该遵循javabean的编写规范
javabean的编写规范:
五个方面:
类的修饰.构造方法,字段,方法,特征,对应为
类都是public都有默认构造函数
字段都是私有的
都有公有的get/set方法
一般都是实现Serializable接口
另外:
- 持久化类的属性要尽量使用包装类的类型
- 持久化类要有一个唯一标识OID与表的主键对应
- 持久化类尽量不要使用final进行修饰
OID:Object Identifier
明确:它是hibernate中独有的(或者是说ORM框架中),如果使用JDBC或者DBUtils没有这个概念
3、hibernate中的主键生成策略
常用的:
native(包含了:identity,sequence,hilo)(hilo highlow高低位算法) 具体选用哪种方法由数据库方言决定.
assigned:程序员手动指定ID
uuid:可以自己在程序中生成,也可以是hibernate的UUID生成策略
4、hibernate的一级缓存
缓存:
它就是内存中的临时数据,当内存对象释放,缓存也就消失了
缓存的优势:
减少和数据库交互的次数,提高查询效率。
什么样的数据适用缓存,什么样的数据不适用缓存
经常查询,但是不经常修改的数据,数据即便出现了问题,对结果影响也不大的,可以用缓存。
需要实时以数据库为准,如果数据出现了问题,对最终结果影响很大的都不能用缓存。
hibernate的一级缓存:
它指的是Session对象说的,是Session对象的内存。
当Session对象关闭时,一级缓存也就消失了。
Hibernate的一级缓存有如下特点:
- 当应用程序调用Session接口的save()、update()、saveOrUpdate时,如果Session缓存中没有相应的对象,Hibernate就会自动的把从数据库中查询到的相应对象信息加入到一级缓存中去。
- 当调用Session接口的load()、get()方法,以及Query接口的list()、iterator()方法时,会判断缓存中是否存在该对象,有则返回,不会查询数据库,如果缓存中没有要查询对象,再去数据库中查询对应对象,并添加到一级缓存中。
- 当调用Session的close()方法时,Session缓存会被清空。
Hibernate 向一级缓存放入数据时,同时复制一份数据放入到Hibernate快照中,当使用commit()方法提交事务时,同时会清理Session的一级缓存,这时会使用OID判断一级缓存中的对象和快照中的对象是否一致,如果两个对象中的属性发生变化,则执行update语句,将缓存的内容同步到数据库,并更新快照;如果一致,则不执行update语句。Hibernate快照的作用就是确保一级缓存中的数据和数据库中的数据一致。
明确:学习对象的状态是为了更好的掌握hibernate中的操作。
状态的分类:
持久化状态:
有OID,和Session有关系
瞬时状态(临时状态):OID的使用前提是hibernate维护(不是assigned)
没有OID,和Session没有关系
脱管状态:
有OID,和Session没有关系
6、解决session的使用原则问题:
session线程不安全 所以多个线程不能操作同一个session
一个线程也应该避免创建多个session,如果在一个线程中获取到多个Session,那么每个Session都有自己独立的事务,这时想让操作处于同一个事务中,将无法实现。
★保证一个线程只有一个Session*********
实现思路:
把Session绑定到ThreadLocal上
hibernate中实现的方式:
在hibernate主配置文件中配置
<property name="hibernate.current_session_context_class">thread</property>
在获取的时候不能在使用openSession(),需要使用getCurrentSession()