zoukankan      html  css  js  c++  java
  • 2、Hibernate持久化编写

    一、对于hibernate中的PO编写规则:

    1. 必须提供一个无参数的public构造方法
     
    2. 所有属性要private ,对外提供public get/set方法
     
    3. PO类必须提供一个标识属性,让它与数据库中的主键对应,我们管这个属性叫OID,Hibernate框架它是通过OID来区分不同的PO对象,如果在内存中有两个相同的OID对象,那么hibernate认为它们是同一个对象。
     
    4. PO类中的属性尽量使用基本数据类型的包装类,使用基本数据类型是没有办法去描述不存在概念,如果使用包装类型,它就是一个对象,对于对象它的默认值是null.。
     
    5. PO类它不能使用final修饰符,Get/load方法它们都是根据id去查询对象。
      1. get直接得到了一个持久化类型对象,它就是立即查询操作
      load它得到的是持久化类开的代理类型对象(子类对象)。它采用了一种延迟策略来查询数据。
      2. get方法在查询时,如果不存在返回null
      load方法在查询时,如果 不存在,会产生异常 ObjectNotFoundException.

    二、Hibernate主键生成策略

     Hibernate中定义的主键类型包括:自然主键和代理主键:

     自然主键:具有业务含义 字段 作为主键,比如:学号、身份证号

    代理主键:不具有业务含义 字段作为主键(例如 自增id),比如:mysql自增主键,oracle序列生成的主键、uuid()方法生成的唯一序列串
    建议:企业开发中使用代理主键!


                 

    三、Hibernate持久化对象状态持久化对象三种状态

    1. 瞬时态:也叫做临时态或自由态,它一般指我们new出来的对象,它不存在OID,hibernate session无关联,在数据库中也无记录。它使用完成后,会被jvm直接回收掉,它只是用于信息携带。
    简单说:无OID 与数据库中的信息无关联,不在session管理范围内。
     
    2. 持久态:在hibernate session管理范围内,它具有持久化标识OID它的特点,在事务未提交前一直是持久态,当它发生改变时,hibernate是可以检测到的。
    简单说:有OID session管理,在数据库中有可能有,也有可有没有。
     
    3. 托管态:也叫做游离态或离线态,它是指持久态对象失去了与session的关联,托管态对象它存在OID,在数据库中有可能存在,也有可能不存在。
    对于托管态对象,它发生改变时hibernet不能检测到。

                                                           

    判断持久化类对象三种状态:
    1. 是否有OID
    2. 判断是否与session关联
                     
    1. 瞬时态(new 出来的)
    瞬时------持久  save   saveOrUpdate
    瞬时-----脱管(游离)  手动设置oid

     

    2. .持久态   它是由session管理
            持久-------瞬时   delete() 被删除后持久化对象不在建议使用
            持久-----脱管  注意:session它的缓存就是所说的一级缓存
                                            evict(清除一级缓存 中指定的一个对象)
                                            clear(清空一级缓存)
                                            close(关闭,清空一级缓存)

     

    3. .脱管态   (它是无法直接获取)
            脱管-----瞬时    直接将oid删除
            脱管----持久  update  saveOrUpdate lock(过时)

    四、Hibernate一级缓存

    Hibernate的一级缓存就是指session缓存。
                    
    actionQueue它是一个行列队列,它主要记录crud操作的相关信息,persistenceContext它是持久化上下文,它其实是真正缓存。
     
    session中定义了一系列的集合来存储数据,它们构成session缓存。只要session没有关闭,它就会一直存在。
     
    当我们通过hibernate中的session提供的一些API例如 save  get  update等进行操作时,就会将持久化对象保存到session中,当下一次在去查询缓存中具有的对象(OID值来判断)就不会去从数据库查询,而是直接从缓存中获取。Hibernate的一级缓存存在的目的就是为了减少对数据库访问。

     

    hibernate中还有一个二级缓存,它是SessionFactory级别缓存。

    示例---演示一级缓存的存在

              


    持久化对象具有自动更新数据库能力

              
    为什么持久化对象具有自动更新数据库能力
            >

    一级缓存常用API

    一级缓存特点:
    1. 当我们通过sessionsave,update saveOrupdate进行操作时,如果一级缓存中没有对象,会将这些对象从数据库中查询到,存储到一级缓存。
     
    2. 当我们通过sessionload,get,Querylist等方法进行操作时,会先判断一级缓存中是否存在,如果没有才会从数据库获取,并且将查询的数据存储到一级缓存中。
     
    3. 当调用sessionclose方法时,session缓存清空。
    clear 清空一级缓存
    evict 清空一级缓存中指定的一个对象。
    refresh重新查询数据库,用数据库中信息来更新一级缓存与快照
                                     


    Hibernate常用API-Session补充update

    udpate操作它主要是针对于脱管对象,持久对象具有自动更新能力。
            问题1:如果我们直接操作的对象是一个脱管对象,执行update会出现什么情况?
    如果对象是一个脱管对象,可以操作,它会将脱管对象转换成持久对象在操作
    如果在session中出现相同的oid两个对象,会产生异常
     
                            >
            问题2脱管对象的oid如果在数据表中不存在,会报异常?
                              >
    所以:在操作中,建议我们通过持久化对象来直接修改其操作。

    saveOrUpdate

    如果对象是一个瞬时对象 --------执行save操作
    如果对象是一个脱管对象---------执行update
    如果是一个持久对象-------直接返回
     

    delete

    删除一个脱管对象,与session关联,在删除
    注意:如果执行delete操作,先删除一级缓存,在删除数据库中的数据。
     
  • 相关阅读:
    hdu-3376-Matrix Again(最小费用最大流)
    CF-164C. Machine Programming(最小费用最大流)
    splay模板
    POJ-3580-SuperMemo(splay的各种操作)
    pygame安装
    hg 证书验证失败
    hdu-3487-Play with Chain-(splay 区间翻转,切割,插入)
    jvm 重载 重写
    多线程踩坑
    hashmap时间复杂度
  • 原文地址:https://www.cnblogs.com/zhh19981104/p/11830199.html
Copyright © 2011-2022 走看看