• Hibernate知识点总结


    1.HelloWorld
      a.xml
      b.annotation
    2.Hibernate原理模拟,什么是O/R Mapping以及为什么要有这个?
    3.常见的O/RKUANGJIAN
    4.基础配置
    5.核心接口介绍
    6.对象的三种状态
    7.ID生成策略
    8.关系映射
    9.hibernate查询(HQL)
    10.在struts基础上继续完善项目
    11.性能优化
    12.补充话题
    -----------------------------
    风格:
    1.先脉络,后细节
    2.先操作,后原理
    3.重Annotation(JPA(EJB)、hibernate(重)-extension(轻)),轻xml配置文件
    --------------------------------
    spring作用:spring提倡编程理念是面向接口编程,面向抽象编程,好处是换实现的时候非常容易,spring会把service注入到action里面去,会把dao注入到service里面去,还会针对

    service进行声明式的事务管理。
    --------------------------------
    hibernate:访问Configuration(直接访问或者单例),创建builSessionFactory(),通过openSession()创建session对象,调用session的save方法,把实体对象传进去就好了,直接

    persistent到DB。
    -----------------------------------
    O/R:Object/Relationship,
    --------------------
    hibernate3.jar
    antlr .jar
    commons-collections.jar
    dom4j.jar
    javassist.GA.jar
    jta.jar
    slf4j-api.jar
    slf4j-nop.jar
    ----------------------
    annotation:
    1:hibernate3.0以后开始支持annotation,目标是建立一个能符合jpa标准的annotation。
    2.引包:
    hibernate-annotation.jar
    ejb3-persistence.jar(符合了jpa标准的annotation的实现)
    hibernate-commons-annotation.jar(进行反射时需要的一个包)
    3.jpa是一种标准,hibernate是它的实现;jdbc是一种标准,各种数据库的driver是它的实现
    4.@Id一般写在get方法上,也可以写在属性上,但是属性是private,所以写在get上更好。
    5.引入javax.persistence.Entity;
    ==================================================
    what is and why O/R Mapping:
    1.JDBC操作数据库很繁琐
    2.sql语句编写并不是面向对象的
    3.可以在对象和关系表之间建立关联来简化编程
    4.O/R Mapping跨数据库平台(换配置文件的方言)
    5.O/R Mapping简化编程(hibernate可以自动建表)
    ---------------------------------------
    课程内容:
    1.helloworld:a.xml;b.annotation
    2.hibernate原理模拟,什么是O/R Mapping以及为什么要有O/R Mapping
    3.常见的O/R框架
    4.基础配置
    5.核心接口介绍
    6.对象的三种状态
    7.ID生成策略
    8.关系映射
    9.查询(HQL)
    10.性能优化
    ---------------------------
    一对一关联:
    1.单项外键关联:在一个对象里面设置另外一个对象的引用,另外一个对象里面不设置;在数据库里面用外键来关联。Annotation:@One2One @JoinColumn
    2.双向外键关联:程序里双向关联,数据库里用外键关联。Annotation:@One2One(mappedBy)。凡是双向必设mappedBy
    3.联合主键:@JoinColumns
    ---------------------------
    常见O/R Mapping框架:
    1.hibernate
    2.toplink
    3.jdo
    4.ibatis
    5.JPA
    ================================
    slf是个接口是个标准,具体的实现可以是:slf4j nodependence(不多,hibernate采用)、log4j、jdk loggin api、apache commons-log

    =============================
    1.UUID 128位,要求必须是string类型。
    2.如果使用hibernate自动建立oracle表,表明不能以下划线开头
    3.id生成策略:AUTO(重点)、IDENTITY(MYSQL、SQL SERVER支持)、SEQUENCE(ORACLE)、TABLE(可以忘记)
    4.指定ID生成策略:
    get方法上写:
    @GenerateValue(stategy=GenerationType.SEQUENCE,generator="下方的名字")
    类上写:
    @SequenceGenerator(name="生成器名字",sequenceName="真正生成到数据库里的名字")

    TableGgenerator了解即可,太复杂,可以忘记
    ================================
    核心开发接口:
    1.SessionFactory可以简单理解为跟数据库的连接还有更复杂的,一个数据源配置一个。

    2.openSession和getCurrentSession(两个不能同时混用)
    a、open永远是打开新的,需要close
    b、g如果当前环境里有未commit的session,就会使用当前环境的,一但commit,再拿就是新的了。用途:界定事务边界;事务提交自动close。

    session上下文:在配置文件里,
    <property name="current_session_context_class">thread(常用getCurrentSession用的就是它)、managed(用到应用服务器,手工管理事务时,极少)、jta、custom(自定义管理

    currentsession)</property>
    -------------------------------------
    client----OrderManager----JTATransaction Manager ---DB2 DB2

    如果多台数据库服务器操作,A数据库操作失败,B数据库也同时回滚,利用数据库驱动来实现,这种情况下用的驱动是XADriver,Java EE要求的。

    Transaction Manager是由Application Server提供。tomcat目前不具备这种能力,要借助第三方类库,例如spring,jboss可以,weblogic可以。

    JTATransactionManager(JAVA TRANSACTION API)一般我们称之为JTA事务,所以一般事务有两种,1、依赖数据库本身,Connection事务(一个数据库)、JTA事务(分布式)。
    -----------------------------------
    hibernate 对象的三种状态:
    ___new____Transient(new)___Save、SaveOrUpdate___Persistent(有ID的)___close___Detached.

    三种状态的区分关键在于:有没有ID,ID在数据库中有没有,在内存中有没有(session缓存)。

     transient:内存中一个对象,没ID,缓存中也没有
    persistent:内存中有,缓存中有,数据库中有,有ID
    detached:内存有,缓存没有,数据库有,有ID。
    ------------------------------------------
    取对象时,用session.get方法和session.load方法的区别
    1.不存在对应记录时表现不一样(get会报错,load不会)
    2.get:马上回发出sql语句,然后从数据库里取出值来装到对象里取。
      load:返回的是这个对象的代理,代理并没有发出语句,这条sql语句其实是在需要用对象的属性时才会发出。
    3.get语句直接从数据库中加载,不会延迟。
    ------------------------------------------------------
    update:
    1.用来更新detached对象,更新完成后转为persistent状态
    2.更新transient对象会报错
    3.更新自己设定id的transient对象可以(数据库有对应记录)
    4.persistent状态的对象只要设定不能字段就会发生更新
    5.merge:需要先从数据库里查出当前对象,再比较不同,再合并。(比较麻烦)6.更改部分字段
        a、xml设定property标签的update属性,annotation设定@Column的updatable属性,不过这种方式很少用,因为不灵活
        b、使用xml中的dynamic-update属性,JPA1.0 Annotation没有对应的东西。
        c、使用HQL(EJBQL)----建议采用此种方法
    7.session.createQuery
    可以是select语句也可以是update语句,语句中不是采用表明,而是实体对象名.

    8.clear方法:无论是load还是get都会首先查找缓存(一级缓存),如果没有,才会去数据库查找,调用clear()可以强制清除session缓存

    9.flush方法:可以强制进行从内存到数据库的同步

    ===========================================
    关系映射(一对一,一对多,多对多)

    对象之间的关系
    1.这里的关系映射指的是对象之间的关系,并不是数据库的关系。

    ============================================
    关联关系中的CRUD_Cascade_Fetch
    1.设定cascade可以设定在持久化时对于关联对象的操作(CUD,R归Fetch管)
    2.cascade仅仅是帮我们省了编程的麻烦而已,不要把的作用看的太大
      a、cascade的属性致命做什么操作的时候关联对象是绑在一起的
      b、Merge=save+update
      c、refresh=A里面需要读B改过之后的数据
    3.铁律:双向关系在程序中要设定双向关联
    4.铁律:双向mappedBy
    5.fetch
      a、铁律:双向不要两边设置Eager(会有多余的查询语句发出)
      b、对多方设置fetch的时候要谨慎,结合具体应用,一般用lazy不用eager,特殊情况(多方数量不多的时候可以考虑,提高效率的时候可以考虑)
    6.O/R Mapping模型编程
      a、映射模型
        a1.jpa annotation(用的最多)
        a2.hibernate annotation extension
        a3.hiberna xml
        a4.jpa xml
      b、编程接口

    hibernate关联没有看完,以后补充
    =================================================================
    HQL(hibernate query language)
    HQL vs EJBQL
    1.功能从大到小:NativeSQL>HQL>EJBQL(JP QL 1.0 HQL的子集)>QBC(Query By Critera)>QBE(Query By Example)
    2.总结:QL应该和导航关系结合,共同为查询提供服务。
    ---------------------------------------------------
    HQL传参时,冒号是占位符。
    --------------------------------------------------
    count(*)返回的是long类型。
    聚合函数(max、min返回的是Object类型
    ----------------------------------------------------
    如果用in和exists都可以,则用exists,执行效率高。
    ---------------------------------------------------
    性能优化:
    1.注意session.clear的运用,尤其在不断分页循环的时候
        a、在一个大集合中进行遍历,遍历msg,去除其中的含有敏感字样的对象
        b、另外一种形式的内存泄露(打开连接不关闭,用文件之后不释放。在语法级别上是没有内存泄露的,因为不需要手动回收内存,但是如果不谨慎处理,将会产生内存泄露。)
    2.1+N问题
    描述:(如果在一个对象里面关联了另外一个对象,同时fatchType为eager,最典型的manyToOne,如果取many,那么关联的对象都会单独再发一条sql语句取出来。所以就发了一条,外加N条


    解决:A或C。不想用关联属性则用A,想用则用C。fetchType设为lazy,N条在合适的时候才会发出
        a、Lazy
        b、BatchSize
        c、join fetch
    3.list和iterate不同之处
        a、list取所有
        b、literate先取ID,等用到的时候再根据ID取得对象
        c、session中list第二次发出,仍会到数据库查询
        d、literate第二次,首先找session级缓存
    4.一级缓存和二级缓存和查询缓存
        a、什么是缓存
        b、什么是一级缓存,session级别的缓存
        c、什么是二级缓存,SessionFactory级别的缓存,可以跨越session存在
              i.经常被访问
              ii、改动不大不会经常改动
              iii、数量有限
        d、打开二级缓存
                 i、hibernate.cfg.xml设定
    <property name="cache.use_second_level_cache">true</property>
            <property name="cache.provider_class">org.hibernate.cache.EhCacheProvider</property>  
    在查询时标明使用查询缓存
    session.createQuery("from table").setCacheable(true).list();
                 ii、@Cache注解
        e、iterate、load默认使用二级缓存
        f、list默认往二缓存加数据,但是查询的时候不使用
        g、如果要query用二级缓存,需打开查询缓存(查询缓存依赖二级缓存)
        i.LRU、LFU、FIFO
        1.Least Recently Used
        2、Least Frequently Used(命中率极地)
        3、First in First Out
        ii、memoryStoreEvictionPolicy="LRU"(ehcache.xml)
    5、事务冰法处理
        a、事务:ACID
            i.Atiomic(原子性)、Consistency(一致性)、Itegrity(独立性)、Durability(持久性)
        b、事务并发时可能出现的问题
        i、第一类丢失更新(Lost Update)-只要支持事务就不会出现这种问题
        ii、脏读(Dirty Read) -读了另外一个事务没有提交的数据
        iii、幻读(phantom  read主要针对插入和删除)
        iv、不可重复读(non-repeatable read)
        v、第二类丢失更新(不可重复读的特殊情况second lost update problem)
        c、事务的隔离机制
        i、查看java.sql.Connection文档
        ii、每种数据库的支持程度不一样,orable支持两种,mysql支持四种(mysql查询隔离:select @@tx_isolation)
                1、READ UNCOMMITTED(1)、READ COMMITTED(2)、REPEATABLE READ(4)、SERIALTIZABLE(8)
            2、只要数据库支持事务,就不可能出现第一类丢失更新
            3、read-uncommitted会出现dirty read、phantom-read、non-repeatable问题
            4、read-commited不会出现dirty read,因为只有另一个事务提交才会读出现结果,但仍会出现non-repeatable read、phantom-read
            5、repeatable read
            6、SERIALTIZABLE解决一切问题
        d、设定hibernate的事务隔离级别
        i、hibernate.connection.isolation=2(默认为2、2是READ COMMITTED,避免了脏读,效率也可以)
        ii、用悲观所解决repeatable read的问题(依赖于数据库的锁)
            1、select...for update
            2、load[xx.class,i,LockMode,Upgrade)
                a、LockMode:none无锁的机制,Transaction结束时,切换到此模式
                b、LockMode:read在查询的时候,hibernate会自动获取锁
                c、LocdeMode:write,insert update hibernate会自动获取锁
                d、以上三种锁的模式,是hibernate内部使用的
                e、LokeMode:UPGRADE_NOWAIT,oracle支持锁的方式

  • 相关阅读:
    递归和回溯的区别
    N皇后问题
    c输出格式
    python sublime run快捷键设置
    八皇后问题
    动态规划---从左上角到右下角的价值最大的路径
    莫队算法详解和c实现
    Shell 常用命令总结
    WeakHashMap和HashMap的区别
    【 Jquery插件】引导用户如何操作网站功能的向导
  • 原文地址:https://www.cnblogs.com/m3Lee/p/4152132.html
Copyright © 2020-2023  润新知