zoukankan      html  css  js  c++  java
  • Hibernate笔记2

    一.持久化类
    1.持久化标识OID
         数据库中叫做主键,对应实体的ID属性即为OID;Hibernate通过OID区分两个对象是否为同一对象;OID的生成一般交由程序自动处理;
    2.持久化类
         概念:持久化类为可以操作数据库的实体类;
             持久化类 = 实体类 + 映射文件(实体类名.hbm.xml)
    3.编写规则:
         (1).类需使用public修饰;
         (2).实现序列化接口;(public class User implements Serializable{....})
         (3).类不能使用final修饰,否则无法构造代理对象;
         (4).属性需使用private修饰,并提供public修饰的getter/setter方法;
         (5).需添加OID属性;
         (6).使用包装类(Long,Double,Integer,Character...)修饰属性
         (7).无参构造需使用public修饰,便于通过反射创建对象;
    4.三种状态:
         区分要点:(1)是否存在OID;(2)是否被session管理;
         i.瞬时态:无ID,无session;
         ii.持久态:有ID,有session;该状态的对象在属性发生变化时,自动更新数据库,而不用调用update方法;
         iii.游离态(脱管态):有ID,无session;

    二.主键(OID)生成策略
    1.分类:
         自然主键:把具有业务含义的字段作为主键;弊端是实际业务中该字段有可能重复,一旦重复就要修改模型,重新定义主键,增加了维护数据库的难度;
         代理主键:把不具备业务含义的字段作为主键,一般取名为"ID",且一般为整型,节省数据库空间;主键生成策略只对代理主键有效!!
    2.生成策略:6种
         increment:自动增长,仅支持数字类型(不推荐使用);原理为先查询数据库表中最大ID值,然后再此基础上加1.如果有用户使用过该ID,后注册用户可以再次使用,导致数据重复问题;
         identity:自动增长,仅支持数据类型,原理为调用了数据库的增长方式.使用该策略之前应确定所使用的数据库支持自动增长,如mysql;
         sequence:原理是通过调用数据库生成序列标识符,前提是确定数据库支持序列,如oracle;
         native:根据数据库对自动生成表示符的能力来选择identity或sequence,最为常用;
         uuid:采用128位的UUID算法来生成标识符,然后被编码为32位的十六进制字符串,由于字符串占用数据库空间较整型较大,也不流行;
         assigned:手动指派(java程序指定);如果不在映射关系文件中配置id元素的generator属性,则默认使用该策略;
    3.配置生成策略:在实体类包下的映射关系文件(实体类.hbm.xml)中

      1     <class name="实体类全限定名" table="数据库表名">
      2         <id name="OID名" column="数据库表字段名">
      3             <generator class="native"></generator>
      4         </id>
      5          ...............
      6      </class>

    三.缓存机制
    1.缓存:
         内存中的一块临时区域,用来提高访问效率,hibernate的缓存机制主要用于提高查询效率;
    2.一级缓存:
         (1)定义:session级别的缓存(与session的生命周期一致),程序自带,不可卸载,由一系列的java集合(Map)构成;
         (2)存取数据的时机:
             i.调用save/update方法时,首先保存到数据库,再放入缓存;
             ii.调用get方法时,先从缓存查找,没有话再从数据库中查找,然后放入缓存;
         (3)验证一级缓存的存在:两次查找同一对象,第一次查询会发送sql语句,第二次没有发送;
         (4)内部结构:
             存在缓存区和快照区;快照区存放的是缓存区数据的副本,程序员不可修改;程序员进行CRUD操作时其实是在操作缓存区,在提交事务时,hibernate会比较两块区域数据的一致性,若不一致,则参照缓存数据修改数据库,并存入快照区一份.
    3.二级缓存:
         SessionFactory级别的缓存;插件形式,需要配置并导入jar包,已被redis等取代;

    四.事务管理
         1.概念:
             逻辑上的一组最小操作单元,特点是同时成功或失败,目的是保证操作的完整性和安全性;
         2.特性:
             原子性:最小操作单元,不可分割;
             一致性:操作前后的数据保持一致;
             隔离性:多个线程之间的事务互不影响;
             持久性:事务提交后,存储至数据库,不可更改;
         3.不考虑隔离性的前提下,会出现的问题
             脏读/不可重复读/虚读
         4.解决以上问题:设置隔离级别
             read uncommited:不解决任何问题 1
             read commited:解决脏读问题 2  oracle的默认隔离级别
             repeatable read:解决脏读和不可重复读的问题 4 mysql的默认隔离级别
             serializable:都可以解决,但是变为单线程,效率低 8
         5.hibernate设置隔离级别
             在核心配置文件(hibernate.cfg.xml)中,添加以下语句:

      1         <hibernate-configuration>
      2              <session-factory>
      3                  <property name="hibernate.connection.isolation">4</property>
      4                  ............
      5              </session-factory>
      6          </hibernate-configuration>

         6.事务控制在service层
             (1)在核心配置文件(hibernate.cfg.xml)中,添加以下语句:
      1         <hibernate-configuration>
      2              <session-factory>
      3                  <property name="hibernate.current_session_context_class">thread</property>
      4                  ............
      5              </session-factory>
      6          </hibernate-configuration>

             (2)使用factory的getCurrentSession方法获取session对象
             (3)使用与当前线程绑定的session对象的时候,不用手动关闭

  • 相关阅读:
    Cookie和Session机制详解
    MySQL数据库MyISAM和InnoDB存储引擎的比较
    MySQL索引背后的数据结构及算法原理
    Qt Meta Object System-元对象系统
    Qt事件处理机制
    学习STL-介绍一下STL
    为什么你有10年经验,但成不了专家?
    关于union的那些事儿
    关于enum的那些事儿
    三子棋局-挑战你的逻辑思维
  • 原文地址:https://www.cnblogs.com/huguangqin/p/7416531.html
Copyright © 2011-2022 走看看