• 一级缓存、二级缓存、延迟加载、hibernate session 域 pojo三种状态


    1.一级缓存(session缓存 )、二级缓存
     
       意义:提高hibernate查询效率。
       缺点:可能会因并发,产生数据不一致。
     
       本质:基于session 的缓存,利用hiberate执行查询的时候,hibernate会首先从session缓存去找,如果存在,则直接返回,如果不存在,则利用orm执行查询  将得到的对象保存至session缓存。
     
       可以使用session.evict(obj);将obj从session缓存移除。
     
       注意:一级缓存,自动开启着的。
     
    public class Text1{
         public static void main(String[] args){
             //创建SessionFactory
              SessionFavtory sessionFactory = null;
             //创建Session
              Session session  = null;
              //事务
              Transaction tx = null;
              try{
                   sessionFactory = new Configuration.configure().buildSessionFactory();
                   session = sessionFactory.getCurrentSession();
                   //开启事务
                   tx = sesison.beginTransaction();
                   UserInfo u1 = new UserInfo("9989","sd","23");
                   system.out.priint("-----------");
                   session.evict(u1);
                   UserInfo u2 = new UserInfo("9989","sd","23");
     
                   //执行U对象 操作 保存
                   Session.save(u);
                    //提交
                   tx.commit();
              }catch(Exception e){
                   e.printStackTrace();
                   //事务回滚
                   tx.rollback();
              }
         }
    }
     
    二级缓存 :也叫 sessionFactory缓存。
     
       本质: 基于sessionFactory的缓存,利用hiberate执行查询的时候,hibernate会首先从session缓存去找,如果存在,则直接返回,如果不存在,则去二级缓存找,存在则返回,不存利用orm执行查询  将得到的对象保存至session缓存,可以存至二级缓存。
     
       注意:二级缓存需要在sessionFactory配置文件中,进行两处配置。
      (a.配置启用二级缓存)
      (b.配置二级缓存实现类)
        需要对缓存本身进行专门配置。
      (xxx.xml--配置缓存)
     
       适用场合:频繁查询,极少修改的对象。
     
    2.延迟加载
     
      hibernate下延迟加载:
      load执行查询的时候,返回hiberate代理对象。
     
       当操作其非主属性的时候(Hibernate.initialize(proxy)),才会利用orm执行查询。   
     
      load/get 区别?
     
       load:  默认  延迟加载  
       查不到: 抛出异常      
       get: 即可加载
       查不到: 返回null
     
    public class Text1{
         public static void main(String[] args){
             //创建SessionFactory
              SessionFavtory sessionFactory = null;
             //创建Session
              Session session  = null;
              //事务
              Transaction tx = null;
              try{
                   sessionFactory = new Configuration.configure().buildSessionFactory();
                   session = sessionFactory.getCurrentSession();
                   //开启事务
                   tx = sesison.beginTransaction();
                   UserInfo u1 = (UserInfo)session.load(UserInfo.class,"1001");
                   system.out.print("-----------");
                   system.out.print(u1.getUse_pwd;    
                    Hibernate.initilize(u1);        
                    //提交
                   tx.commit();
              }catch(Exception e){
                   e.printStackTrace();
                   //事务回滚
                   tx.rollback();
              }
         }
    }
    <!DOCTYPE hibernate-mapping PUBLIC
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
    <hibernate-mapping package="com.it.bean">
        <class name="UserInfo" table="userInfo" lazy="true">    <!--是(true)否(false)延迟加载-->
            <id name="user_id" column="user_id">
                <!-- 主键生成策略 -->
                <generator class="assigned"></generator>
            </id>
            <property name="user_pwd" column="user_pwd"></property>
            <property name="user_sex" column="user_sex"></property>
     
     
    3.hibernate 、session域 、pojo(java Bean的对象)三种状态
     
      研究的session 域 /数据库 (oid-pk) 与 pojo 关系
     
      瞬时态(临时态):数据库无 session无
     
      持久态: session域 有 save/saveOrupdate/get/load/....
                   对持久态pojo操作,在事务提交前将会被 hibernate  利用 orm  同步到数据库。
     
      脱管态(游离态): 数据库存在,而session 无
     
      注意:session中不能有两个不同的对象,拥有一样的oid。
                delete-(脱管态)-->持久态--->瞬时态
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
  • 相关阅读:
    Mac中,在ITerm2下使用ssh访问Linux
    Yosemite下安装jdk、mysql、maven、idea
    SCP对拷如何连接指定端口(非22端口)的远程主机
    Mac下关于python版本的问题
    Mac中命令行zip压缩文件或者目录时,取出隐藏文件和系统文件的方法
    Intellij IDEA 13.1.2发布
    springframework中使用ReloadableResourceBundleMessageSource加载properties文件的问题
    Hibernate-Validator 5.1.0.Final 无法解析自定义占位符的问题
    vs2013如何寻找快捷键
    关于c++的命名空间
  • 原文地址:https://www.cnblogs.com/nin-w/p/5907448.html
Copyright © 2020-2023  润新知