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

    1、hibernate中的两种配置文件:

    1.配置文件 hibernate.cfg.xml
       文件中包括:
         1.连接数据库的相关信息
         2.hibernate框架本身的一些属性设置
         3.对实体类进行映射的映射文件路径
      这文件的名字默认是叫hibernate.cfg.xml,默认存放的文件就是直接放在src下面,这样的好处就是,将来hibernate会自动的去读取src下面的一个叫做hibernate.cfg.xml的文件。
      我们是可以修改名字和路径的,只不过修改完之后要把新的名字和路径传给hibernate才行。

    2.映射文件 xxx.hbm.xml
       作用:对实体类进行映射.
       其实就是描述类和数据库中表的映射关系.
       <id>标签对主键映射的描述
       <property>标签对其他属性映射的描述
       
       这个文件的名字一般会叫做xxx.hbm.xml,xxx就是这个文件所要映射的那个类的名字,
       这个文件的位置一般会放在和文件所映射的类相同的位置。

    2、Hibernate 重要接口

    org.hibernate.cfg.Configuration类
    作用:
      1.读取配置文件hibernate.cfg.xml
      2.创建SessionFactory对象

    org.hibernate.SessionFactory接口
    作用:
      产生Session接口的实现类对象

    只有Configuration类对象读取了正确配置的hibernate.cfg.xml文件之后,才能创建出SessionFactory接口的实现类对象.

    注意:hibernate.cfg.xml文件中包含了映射文件的路径,所以,映射文件中的内容也必须配置正确,
    否则SessionFactory接口的实现类对象还是创建不出来.

    SessionFactory接口的实现类对象,在一个使用hibernate框架的项目中,只需要有一个这样的对象就可以.

    org.hibernate.Session接口
    作用:
      完成代码和数据库之间的交互.
     
      hibernate中,如果没有session对象,那么任何数据库的操作都做不了.

    org.hibernate.Transaction接口
    作用:
      一个Transaction类型对象代表着一个事务.

    在使用session进行操作数据之前,要先开启一个事务.


    3、hibernate中的实体类对象

    hibernate把实体类对象分为三种:

    transient   自由状态/瞬态

    detached    游离状态/脱管状态

    persistent  持久化状态


    4、hibernate中的锁机制:

    hibernate中锁机制分为乐观锁和悲观锁:
    悲观锁:hibernate是利用了数据库里面的锁机制来完成的,比如oracle中sql语句里面的for update和for update nowait来实现的。
    select * from teacher where id=1 for update
    select * from teacher where id=1 for update nowait
    乐观锁:依靠hibernate中的一些设置和配置来完成的.
    hibernate中的锁机制:
    如果在hibernate中把事务隔离级别设置为serializable,那么我们就完全没有必要使用hibernate中的锁机制了,
    但是这样设置后事务的执行效率很低,所有我们一般会设置为read-committed,这样既能解决脏读又有一定的效率,只是在
    这种设置下仍然会有不可重复读的问题(幻读不考虑,很少出现),所有我们在hibernate就可以使用锁机制来解决这个问题.

    5、Hibernate中的事务

    isolation  事务隔离级别

     read-uncommitted  不提交也能读
     read-committed    提交之后才能读 解决了脏读
     repeatable-read   解决了脏读和不可重复读
     serializable      三个问题都解决了

     级别越高解决的问题越多但是效率越低。
     注意:并不是所有数据库都支持这四种事务隔离级别,比如oracle就只支持第二种和第四种这俩种,比如mysql就四种全支持.
     
     oracle里面默认的事务隔离级别是第二种:read-committed

    事务以及事务所引发的问题

    1.脏读  主要针对update操作。 一个事务A读到另一个事务B中修改过但是还没有提交的数据

    2.不可重复读  主要针对update操作。 一个事务A在第一次读数据和第二次读数据之间,有另一个事务B把这个数据更改并提交了,所有就出现了
    事务A里面读一个数据俩次,但是读到的结果是不同的。

    3.幻读  主要针对的是insert/delete操作。事务A第一次用where条件筛选出了10条数据,事务A第二次用通样的where
    条件筛选出的却是11条数据,因为事务B在事务A的第一次和第二次查询直接进行了插入操作,并且插入的这个数据满足事务A的where筛选条件.

    6、hibernate中的缓存:

    一级缓存: Session级别的缓存
    二级缓存: SessionFactory级别的缓存
       1.默认情况情况下二级缓存是不能使用的。
       2.需要一些相应的配置之后才能开启二级缓存

    查询缓存: 针对hql语句查询(Criteria)
       1.查询缓存默认是关闭的
       2.使用查询缓存需要hibernate.cfg.xml中做配置
        <property name="cache.use_query_cache">true</property>
       3.查询缓存依赖于二级缓存
       4.在代码里面,使用query进行查询之前,同时需要设置一下使用查询缓存:
              query.setCacheable(true).list();

    配置二级缓存:
    1.把需要的俩个jar导入到当前项目里面
        commons-logging.jar
        ehcache-1.2.3.jar
    2.把ehcache.xml直接复制粘贴到src下面

    3.在hibernate.cfg.xml中配置使用二级缓存
        <property name="cache.use_second_level_cache">true</property>

    4.在hibernate.cfg.xml中配置出实现了二级缓存的提供者
        <property name="cache.provider_class">org.hibernate.cache.EhCacheProvider</property>
        
    5.配置ehcache.xml文件,如果不配置,使用里默认的配置也是可以的.


    6.在某个类的映射文件中配置,指明这个类的对象将来是可以放进二级缓存里面的.
        <cache usage="read-write"/>


  • 相关阅读:
    python包的安装及依赖-pip wget pipdeptree
    Http、Socket、WebSocket之间联系与区别
    python的https请求移除ssl验证警告
    uwsgi启动django应用 https访问设置问题解决 & uwsgi: unrecognized option '--https' | ubuntu20.04
    图像frame大小计算
    完全实验|不完全实验|
    随机区组设计|拉丁方
    TPO2-3 Early Cinema
    TPO2-1Desert Formation
    TPO9-2Reflection in Teaching
  • 原文地址:https://www.cnblogs.com/yang75n/p/8419841.html
Copyright © 2011-2022 走看看