hibernate略知一二

  实体对象的生命周期

          实体对象

                      是指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 >

          

                

                 

原文地址:https://www.cnblogs.com/hjiongjiong/p/4502129.html