实体对象的生命周期
实体对象
是指hibernate的o/r映射关系中的域对象,即o/r中的o;
实体对象的生命周期
是指实体对象由产生到被gc(回收站)回收的一段过程,在这段过程中实体对象有三种状态。自由状态、持久状态、游离状态。
实体对象的三种状态
自由状态的特征:1、不处于session的缓存中,不被任何一个session实例关联。
2、在数据库中没有对应的记录。
持久状态的特征:1、处于session的缓存中,与一个session实例相关联。
2、在数据库中有相对应的记录。
游离状态的特征:1、是由持久状态转换过来的,在数据库中还有可能存在与之对应的数据。
2、不再位于session的缓存之中。
vo(value object)与 po(persistent object)
vo:即将处于自由状态和游离状态的实体对象称为值对象,即为vo
po:将持久化状态的实体对象称为持久对象,即为po。
vo与po的区别
1:vo是相对独立的对象,处于非管理状态。
2:po是hibernate纳入其管理容器的对象,代表与数据库中某条记录对应的hibernate实体,po的变化在事务提交时将反应到实际数据库中。
3:如果一个po与其对应的session实例分离,即转变为vo。
session接借口详解
是hibernate向应用程序提供的操作数据库的最主要借口。提供了最基本的保存,更新,删除,加载java对象的方法
清理缓存:能够在某些时间点,按照缓存中对象的变化来执行相关的sql语句,来同步更新数据库的过程。(flush)
threadlocal模式的解决方案
threadlocal线程局部变量,作用是为每一个使用该变量的线程都提供一个变量值的副本,并且每个线程都可以独自改变自己的副本,而不会和其他线程冲突
session的使用
save()方法 和 Persist():使一个自由对象转变为持久对象。
session.save(News news) ; 如果映射文件里吧generator设置为increment等自动生成,则会引用系统的自增序列
步骤:1、把对象加入session缓存中,使它进入持久状态2、选用映射文件指定的标示符生成器,为持久化对象分配一个唯一的oid(对象标识)。
3、计划执行一个insert语句,把对象当前的属性值组装到insert语句中,在提交事务的时候,才会真正执行insert语句。
如果在save方法后,commit之前,又修改了对象的值,则commit时会执行2条sql语句,一条insert和一条update
persist方法不会立刻生成oid,可能在commit时才生成,也不会计划执行sqlyuju
update()方法 :将一个游离对象转变为持久对象,并且将计划执行一条update语句。
步骤:1、把对象加入session缓存中,使它进入持久状态。
2、计划执行一个insert语句,把对象当前的属性值组装到insert语句中,在提交事务的时候,才会真正执行insert语句。
如果在save方法后,commit之前,又修改了对象的值,则commit时只会执行一条update。
saveOrupdate()方法:传入一个临时对象的时候,就调用save方法转变为持久对象,传入一个游离对象的时 候,就调用update方法转变为持久对象。
load()和get()方法:根据制定的oid从数据库中加载一个持久对象。
区别:1、当数据库中不存在与oid相对应的记录时,load()会抛出一个objectNotFoundException异常,get()会返回null
2、两者采用不同的检索策略:get()会忽略映射文件中class元素中的lazy
延迟检索和立即检索的区别:一个对象中组合了另外一个对象,如果操作外面这个对象的某个除组合对象外的属性,则检索的sql只会执行外面对象的数据查询为延 迟检索,反之为立即检索。
delete()方法:用于从数据库中删除一个java对象,可以删除持久对象和游离对象。。
如果传入的是游离对象,则会将游离对象和session关联,转变成持久对象,然后计划执行删除
hibernate的映射类型
在对象-关系映射中(o/r)hibernate采用映射类型作为java类型和sql类型的桥梁
hibernate的映射类型分为2类:内置映射类型和客户化映射类型
内置映射类型负责把一些常见的java类型映射到相应的sql类型。客户化映射类型:实现usertype接口和compositusertype接口映射用户自定义的java类型。
集合映射: 值类型的集合映射:该集合存放的对象没有oid,生命周期依赖所属对象的声明周期。分为映射set集,映射list集,映射map
set集接口:一种最简单的集合,集合中的对象不按特定的方式排列,并没有重复的对象。hashset(哈希算法)和treeset(排序)实现,无索引
可以获得一个迭代器对象 set.iterator
映射文件
第一种,不需要set映射表的实体类
<set name="实体类属性名" table="映射的表名" lazy="ture">
<key column="外健列名" />
<element column="属性列明" type="" not-null="true"/>
</set>
list集合借口:其对象以线性方法存储,集合中允许存放重复对象。arraylist(数组)和likedset(链表结构),有索引
都可以通过comparator进行自然排序 可以获得一个迭代器对象 list.iterator
不需要list映射表的实体类
<list name="实体类属性名" table="映射的表名" lazy="ture">
<key column="外健列名" />
<list-index column="索引字段名" --该字段会自动生成oid排序,是根据不同的对象id生成,即每个对象的都从0开始
<element column="属性列明" type="" not-null="true"/>
</list>
map映射 是一种把健对象和值对象进行映射的集合,他的每一个元素都包含一个健对象和值对象,而值对象仍然可以是map类型,依次类推,可以形成多级映射。
健对象必须唯一,而值对象可以相同
<Map name="实体类属性名" table="映射的表名" lazy="ture">
<key column="外健列名" />
<list-key column="键字段名" type=“”/〉
<element column="值字段名" type="" not-null="true"/>
</Map >