Hibernate
1.orm思想
Object relational mapping:对象关系映射
让实体类和数据库表进行一一对应
不需要直接操作数据库表,而操作表对应的实体类对象。
2.缓存
什么是缓存
1 数据存到数据库里面,数据库本身是文件系统,使用流方式操作文件效率不是很高。 (1)把数据存到内存里面,不需要使用流方式,可以直接读取内存中数据 (2)把数据放到内存中,提供读取效率 |
Hibernate缓存
1 hibernate框架中提供很多优化方式,hibernate的缓存就是一个优化方式
2 hibernate缓存特点: 第一类 hibernate的一级缓存 (1)hibernate的一级缓存默认打开的 (2)hibernate的一级缓存使用范围,是session范围,从session创建到session关闭范围 (3)hibernate的一级缓存中,存储数据必须 持久态数据
第二类 hibernate的二级缓存 (1)目前已经不使用了,替代技术 redis (2)二级缓存默认不是打开的,需要配置 (3)二级缓存使用范围,是sessionFactory范围 |
01-一级缓存执行过程
02-一级缓存快照区执行
3.No session问题
联系人列表功能
1 查询所有的联系人,显示每个联系人所属的客户名称
2 列表功能中有no session问题 (1)no session解决: - 让session操作之后不会马上关闭,在action操作之后进行关闭 - 封装实现方式:让session延迟关闭
(2)具体使用 封装过滤器,只需要配置封装的过滤器就可以了 配置到struts2过滤器前面
还有的问题:
|
4.核心配置文件
Hibernate.cfg.xml
<hibernate-mapping package="com.my.qb.domain"> <class name="Dept" table="DEPT_P"> <id name="id" column="DEPT_ID"> <generator class="uuid"></generator> </id> <property name="deptName" column="DEPT_NAME"></property> <property name="state" column="STATE"></property>
<!-- 自关联 子部门与父部门 多对一 --> <many-to-one name="parent" class="Dept" column="PARENT_ID"></many-to-one>
<!-- private Set<User> users = new HashSet<User>(0);//部门与用户 一对多 --> <set name="users"> <key column="DEPT_ID"></key> <one-to-many class="User"/> </set> </class> </hibernate-mapping> |
5.主键生成策略
assigned
让应用程序在save()之前为对象分配一个标示符。这是 <generator>元素没有指定时的默认生成策略。
sequence
在DB2,PostgreSQL, Oracle, SAP DB, McKoi中使用序列(sequence), 而在Interbase中使用生成器(generator)。返回的标识符是long, short或者 int类型
identity
对DB2,MySQL, MS SQL Server, Sybase和HypersonicSQL的内置标识字段提供支持。 返回的标识符是long, short 或者int类型的
uuid
用一个128-bit的UUID算法生成字符串类型的标识符, 这在一个网络中是唯一的(使用了IP地址)。UUID被编码为一个32位16进制数字的字符串
6.hiberante框架特点? 与JDBC操作进行对比
1. 使用hql开发,比使用SQL开发,开发简单、效率高
2. hql是面向实体对象的语言,数据库的迁移性好 (可以同时支持多种数据库)
3. hibernate程序的运行效率低,jdbc的运行效率高
A、数据库openSession时速度慢
B、hql转换成sql时,需要消耗性能
C、hql的开发习惯,一次提取记录的所有字段信息进行映射;
sql的习惯是,需要哪些字段就提取哪些字段;
4. hibernate有懒加载特性
7.Hibernate对象状态(object states)
Hibernate定义并支持下列对象状态(state):
瞬时(Transient) - 由new操作符创建,且尚未与Hibernate Session 关联的对象被认定为瞬时(Transient)的。瞬时(Transient)对象不会被持久化到数据库中,也不会被赋予持久化标识(identifier)。 如果瞬时(Transient)对象在程序中没有被引用,它会被垃圾回收器(garbage collector)销毁。 使用Hibernate Session可以将其变为持久(Persistent)状态。(Hibernate会自动执行必要的SQL语句)
持久(Persistent) - 持久(Persistent)的实例在数据库中有对应的记录,并拥有一个持久化标识(identifier)。 持久(Persistent)的实例可能是刚被保存的,或刚被加载的,无论哪一种,按定义,它存在于相关联的Session作用范围内。 Hibernate会检测到处于持久(Persistent)状态的对象的任何改动,在当前操作单元(unit of work)执行完毕时将对象数据(state)与数据库同步(synchronize)。 开发者不需要手动执行UPDATE。将对象从持久(Persistent)状态变成瞬时(Transient)状态同样也不需要手动执行DELETE语句。
脱管(Detached) - 与持久(Persistent)对象关联的Session被关闭后,对象就变为脱管(Detached)的。 对脱管(Detached)对象的引用依然有效,对象可继续被修改。脱管(Detached)对象如果重新关联到某个新的Session上, 会再次转变为持久(Persistent)的(在Detached其间的改动将被持久化到数据库)。 这个功能使得一种编程模型,即中间会给用户思考时间(user think-time)的长时间运行的操作单元(unit of work)的编程模型成为可能。 我们称之为应用程序事务,即从用户观点看是一个操作单元(unit of work)。
总结:
所谓的Hibernate对象状态,指的是hiberante的映射对象(有映射关系存在)
持久(Persistent): 实体对象通过hibernate写入到数据库后,就称为持久态
1. 要有持久化标识 (主键) ,数据库中要有对应的对象
2. 这个对象要与session关联
脱管(Detached) : 所谓的托管对象就是脱离了hibernate的session管理
场景:把一个对象写入数据库,然后关闭session,这时对象就称为了托管对象;
1. 要有持久化标识 (主键), 数据库中要有对应的对象
2. 这个对象不要与session关联
瞬时(Transient):
1. 这个对象只是内存对象,数据库中没有映射对象
2. 这个对象不要与session关联