2019独角兽企业重金招聘Python工程师标准>>>

* 检索策略
* 区分类级别和关联级别检索
1)类级别检索:直接加载目标对象本身----Customer c = session.get(Customer.class,1);
2)关联级别检索:通过检索到的对象导航到关联的对象---Customer c = session.get(Customer.class,1);c.getOrders();

* 关联级别检索中,由一方(客户)关联查询多方(订单)
    在Customer.hbm.xml中<set>,两个属性 fetch lazy
    a. fetch="join" lazy将被忽略 ---查询客户时,会立即查询订单,sql形式为左外连接查询
    b. fetch="select"
        lazy="false"---查询客户时,会立即查询订单,sql形式为多条sql查询-----select * from customer where id = 1;select * from orders where cid = 1;
        lazy="true"----查询客户时,不会立即查询订单,当访问订单集合size时,发出sql查询订单详情----select * from orders where cid = 1;
        lazy="extra"---查询客户时,不会立即查询订单,
            当访问订单集合size时,发出sql统计订单数量---select count(id) from orders where cid = 1;
            当访问订单属性时,发出sql查询订单真实信息---select * from orders where cid = 1;
    c. fetch="subselct"
        lazy="false"---查询客户时,会立即查询订单,sql形式为子查询---select * from orders where cid in(select id from customer)
        lazy="true"----查询客户时,不会立即查询订单,当访问订单集合size时,发出sql查询订单详情---select * from orders where cid in(select id from customer)
        lazy="extra"---查询客户时,不会立即查询订单,
            当访问订单集合size时,发出sql统计订单数量---select count(id) from orders where cid = 1;
            当访问订单属性时,发出sql查询订单真实信息,sql形式为子查询---select * from orders where cid in(select id from customer)
* 当使用Query.list(hql)方法查询时,会忽略fetch="join",是延迟还是立即检索订单,由lazy决定

* 关联级别检索中,由多方(订单)关联查询一方(客户)
    在Order.hbm.xml中<many-to-one>,两个属性 fetch lazy
    a. fetch="join" lazy被忽略---查询订单时,会立即查询订单关联的客户,sql形式为左外连接查询---select o.*,c.* from orders o left outer join customer c on c.id = o.cid and o.id = ?
    b. fetch="select"
        lazy="false":查询订单时,会立即查询订单关联的客户,sql行为为多条sql--select * from orders where id = ?;select * from customer where id = ?
        lazy="proxy":
            如果Customer.hbm.xml中配置<class name="cn.itcast.domain.Customer" lazy="false">---立即查询客户
            如果Customer.hbm.xml中配置<class name="cn.itcast.domain.Customer" lazy="true">---不会立即查询客户
* 当使用Query.list(hql)方法查询时,会忽略fetch="join",是延迟还是立即检索客户,由Customer.hbm.xml类级别检索策略决定
            如果Customer.hbm.xml中配置<class name="cn.itcast.domain.Customer" lazy="false">---立即查询客户
            如果Customer.hbm.xml中配置<class name="cn.itcast.domain.Customer" lazy="true">---不会立即查询客户
* 批量检索----减少sql数量,提供查询效率
    查询所有客户时,在Customer.hbm.xml中<set batch-size="5">---表示一次最多可以查询5个客户的订单
    查询所有订单时,在Customer.hbm.xml中<class name="cn.itcast.domain.Customer" batch-size="5">---一次最多查询5个客户

---------------------------------------------------
ACID,指数据库事务正确执行的四个基本要素的缩写。
包含:原子性(Atomicity)、一致性(Consistency)、隔离性 (Isolation)、持久性(Durability)

* 事务并发引发的问题:
1)脏读:一个事务读取到了另一个事务没有提交的数据
2)幻读:一个事务读取到了另一个事务提交的数据(insert)
3)不可重复读:一个事务读取到了另一个事务提交的数据(update)
4)丢失更新:后一个事务覆盖了前一个事务提交的数据

* 解决丢失更新问题
1)悲观锁:使用数据库底层锁机制,锁定操作的数据,防止并发发生
2)乐观锁:在持久化类中添加版本字段,当事务提交时,比较提交的版本是否和数据库中的版本字段一致,如果不一致,抛出异常阻止修改
    public class User {
    private Integer id;
    private String name;
    private Integer age;
    //版本字段
    private Integer ver;

User.hbm.xml中
    <class name="cn.itcast.domain.User" table="user">
        <id name="id">
            <generator class="native"></generator>
        </id>
        <!-- 加入版本字段 -->
        <version name="ver" type="integer"></version>
        <property name="name" length="20"></property>
        <property name="age"></property>
    </class>

* hibernate缓存分为一级缓存和二级缓存
一级缓存为hibernate内置缓存,不用配置
二级缓存为外置缓存,hibernate框架没有提供二级缓存的实现,要使用二级缓存,需要借助第三方产品

* 配置二级缓存
1)将EHCache相关jar导入项目
2)将EHCache核心配置文件放在src下ehcache.xml
3)在hibernate.cfg.xml中开启二级缓存
    !-- 开启二级缓存 -->
    <property name="hibernate.cache.use_second_level_cache">true</property>
4)指定二级缓存提供商:
    <!-- 指定二级缓存提供商 -->
    <property name="hibernate.cache.provider_class">net.sf.ehcache.hibernate.EhCacheProvider</property>
5)在hibernate.cfg.xml中配置哪些类和集合使用二级缓存
    <!-- 配置哪些类和集合放入二级缓存  -->
    <class-cache usage="read-write" class="cn.itcast.domain.Customer"/>
    <class-cache usage="read-write" class="cn.itcast.domain.Order"/>
   
    <collection-cache usage="read-write" collection="cn.itcast.domain.Customer.orders"/>

* 配置查询缓存
    hibernate.cfg.xml中配置
    <!-- 配置使用查询缓存 -->
    <property name="hibernate.cache.use_query_cache">true</property>

Session session1 = HibernateUtils.getSession();
        Transaction tx1 = session1.beginTransaction();
       
        Query query = session1.createQuery("from Customer");
        query.setCacheable(true);//使用查询缓存,将查询出的数据放入查询缓存中
        query.list();//将查询出的数据放入一级缓存和二级缓存
       
        Query query2 = session1.createQuery("from Customer");
        query2.setCacheable(true);//使用查询缓存
        query2.list();//不会发出sql,直接从查询缓存中获取
       
        tx1.commit();
        session1.close();

转载于:https://my.oschina.net/yangzhiyuan/blog/208096

hibernate笔记相关推荐

  1. Hibernate 笔记 HQL查询

    http://www.cnblogs.com/zilong882008/archive/2011/11/05/2237123.html Hibernate 笔记 HQL查询(一)单属性,多属性查询 H ...

  2. Hibernate笔记节选

    为大家整理了一下前两天的Hibernate笔记 来源:ganbin ************************ ?saxT *    Hibernate课件   * LEuDw| ******* ...

  3. 2.[精通Hibernate笔记]整合Spring

    Spring3.0已不再支持Hibernate2.x,仅为Hibernate3.x提供支持,且要求Hibernate必须在3.2版本以上. 配置SessionFactory 使用Hibernate框架 ...

  4. Hibernate 笔记1

    Hibernate表generator标签的作用,如下图,

  5. hibernate笔记--缓存机制之 一级缓存(session缓存)

    一级缓存: 又称为session缓存,它和session生命周期相同,周期非常短.是事务级别的缓存: 还是以Book和Category这两个表为例,我们用代码观察一个缓存的存在: 假设现在我要去查询i ...

  6. Hibernate 笔记 缓存

    1 Hibernate 缓存 缓存是数据库数据在内存中的临时容器,它包含了库表数据在内存中的临时拷贝,位于数据库和访问层之间.ORM在进行数据读取时,会根据缓存管理策略,首先在缓冲中查询,如果发现,则 ...

  7. Hibernate 笔记4 实现对数据库的增删改查

    1  准备 首先在mysql数据库中建表User,并添加相关信息. user表结构如下. +-------+--------------+------+-----+---------+-------- ...

  8. 汤阳光 Hibernate笔记

    2019独角兽企业重金招聘Python工程师标准>>> 1. Hibernate检索 1.1. hibernate检索方式说明 Hibernate 提供了以下几种检索对象的方式 导航 ...

  9. Hibernate笔记2

    hibernate实体的状态 实体Entity有三种状态,瞬时状态,持久状态,脱管状态 瞬时状态:transient,session 没有缓存,数据库也没有记录,oid没有值 持久状态:persist ...

最新文章

  1. mysql 改变枚举值_mysql 改变数据类型为枚举不成功?
  2. 山科大计算机专业排名,山东科技大学专业排名情况
  3. static关键字的使用
  4. python爬虫登陆网页版腾讯课堂
  5. 动态代理源码分析,实现自己的动态代理
  6. 小度智能音响拆解 芯片_拆解报告:小度人工智能音箱1S
  7. 未来的人工智能和 AR/VR 会从哪些方面影响教育?有什么机会?
  8. 计算机打印基础知识教程,员工计算机基础知识普及教程(ppt 84页)
  9. background-image使用
  10. 安装caffe中间遇到的一些问题
  11. C版iPhone4也给国产旗舰手机带来机会
  12. 超声波测距 c语言程序流程图,超声波测距程序(详细C语言数码管显示)
  13. ssh连接超时解决方法
  14. Chrome浏览器设置黑色模式
  15. server sent event
  16. 传统责任链模式和变种责任链模式
  17. 【蓝桥杯嵌入式备赛】10.拓展板数码管、ADC按键及光敏电阻
  18. java中循环右移两位_1008 数组元素循环右移问题 (20分)【java题解】
  19. c语言代码运行成图指令代码,C语言图形编程代码.doc
  20. 硬件描述语言VHDL之并行语句基本使用介绍

热门文章

  1. confluence mysql 中文乱码_解决confluence的乱码问题
  2. sentinel使用(结合OpenFeign)
  3. SpringBoot请求日期参数异常(Failed-to-convert-value-of-type-'java-lang-String'-
  4. Docker搭建网页数据库管理-Adminer
  5. QT信号与槽——观察者模式——回调函数
  6. Tomcat单向Https验证搭建,亲自实现与主流浏览器、Android/iOS移动客户端安全通信
  7. 想转行软件测试,简历怎么包装成1年工作经验的测试工程师
  8. python 数据逐个验证_在python中验证数据的最佳方法是什么?
  9. 系统延时任务和定时任务
  10. python函数拟合不规则曲线_python中的多变量(多项式)最佳拟合曲线?