• 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 >

              

                    

                     

  • 相关阅读:
    U3D开发中关于脚本方面的限制-有关IOS反射和JIT的支持问题
    APP发行渠道
    在WINDOWS上开发IOS应用的方法
    如何安全的在不同工程间安全地迁移asset数据?三种方法
    UNITY 的GC ALLOC到底是什么
    Dictionary,hashtable, stl:map有什么异同?
    如何成为一个优秀的高级C++程序员
    两点间所有路径的遍历算法
    技术人员的未来:做技术还是做管理?
    技术人员如何去面试?
  • 原文地址:https://www.cnblogs.com/hjiongjiong/p/4502129.html
Copyright © 2020-2023  润新知