笔记-Hibernate

1.hibernate原理

   读取并解析配置文件

   读取并解析映射信息,创建SessionFactory

   打开session

   创建事务Transaction

   持久化操作

   提交事务

   关闭session

2.hibernate缓存机制

 hibernate提供了缓存机制,对于那些改动不大且经常使用的数据,可以将它们放到缓存中,不必在每次使用时都去查询数据库,提升了性能

 1)一级缓存是Session级别的缓存,由Session负责管理,因此一级缓存是Session独享的,即每个Session只能访问自己的一级缓存区

 2)二级缓存是SessionFactory级别的缓存,由SessionFactory负责管理,因此二级缓存是Session间共享的,即不同的Session都可以访问二级缓存区,二级缓存默认未启用

  一级缓存和二级缓存相同的地方是:他们缓存的都是对象数据  

  step1:了解二级缓存的策略
       EHCache/OSCache/SwarmCache/TreeCache
   step2:配置 ehcache.xml,默认放在src下
      <defaultCache
             maxElementsInMemory="10000" 内存中最大缓存多少个对象
             eternal="false" 指定缓存对象是否永久缓存
             timeToIdleSeconds="120" 对象被缓存120秒后,依然空闲就要从内存中删除掉
             timeToLiveSeconds="120" 对象被缓存120秒之后,不管是否调用都要被删除
             overflowToDisk="true" 支持缓存对象溢出后放到磁盘上
             />
      <diskStore path="java.io.tmpdir"/> 指定溢出缓存的位置
    step3:在主配置文件hibernate.cfg.mxl中启用二级缓存策略
    <!-- 启用二级缓存策略为ehcache-->
        <property name="hibernate.cache.provider_class">
            org.hibernate.cache.EhCacheProvider
        </property>
    step4:指定哪些对象可以使用二级缓存,需要在对应对象的映射描述文件中指定
       例如:User.hbm.xml
                <cache usage="read-only" region="sampleCache1"/>
    step5:测试

 3)查询缓存:基于二级缓存,一般跟二级缓存结合使用,默认未启用

      缓存两部分:查询的结果集/hql或者sql语句

    step1:二级缓存已经开启的基础之上,在主配置文件中开启查询缓存
    <!-- 启用查询缓存 -->
     <property name="hibernate.cache.use_query_cache">true</property>
    step2:在执行query.list()之前调用query.setCacheable(true); 指定该查询,使用查询缓存

   二级缓存和查询缓存:多个用户频繁使用的对象,是跨用户的

4)管理缓存:如何清除缓存中的对象

   session.evict();一级缓存清理

   sessionFactory.evict();二级缓存清理

   sessionFactory.evictCollection();二级缓存对象集合清理

3.hibernate查询方式

 1)使用API查询,如get.load

  2)使用hql查询

  3)使用sql查询

  4)使用Criteria查询

4.延迟加载

 1)延迟加载(懒惰加载):使用hibernate方法查询数据时,hibernate返回的只是一个空对象,id外属性都为null,并没有真正查询数据库,而在使用这个

对象时才会触发查询数据库,并将查询到的数据注入到这个空对象中这种将查询时机推迟到对象访问时的机制称为延迟加载

    get:立即加载,没有使用延迟加载技术,方法调用后立即返回查询对象

    load:懒惰加载,使用延迟加载对象,返回的是一个查询对象的代理对象,对象中的数据是空的

  2)与延迟加载相关的操作

   a.配置文件中配置<class lazy=" "> lazy 属性控制其是否启用延迟加载,默认lazy="true"

   b.可以使用Hibernate.initialize(Object proxy)方法,将代理对象加载

   c.没有延迟加载机制的get方法

  3)hibernate中具有延迟加载机制的查询方法

    a.session.load()

    b.query.iterate()

    c.关联映射中对关联属性的加载

5.hibernate的核心接口

  1)Configuration:负责加载主配置文件信息,同时也加载映射关系文件信息

  2)SessionFactory:负责创建session对象

  3)Session:数据库连接会话,负责执行增删改操作

  4)Transaction:负责事务控制

  5)Query:负责执行特殊语句

6.为什么要用hibernate

  1)对JDBC访问数据库的代码做了封装,大大简化了数据访问层繁琐的重复性代码

   2)hibernate是一个基于JDBC的主流持久化框架,是一个优秀的ORM实现,很大程度简化DAO层的编码

   3)hibernate使用反射机制,而不是字节码增强程序来实现透明性

   4)hibernate的性能很好,是一个轻量级的框架,映射的灵活性出色,支持各种关系数据库,从一对多到多对多的各种复杂关系

7.主键管理策略 6.1.4.1. Generator
   1)配置<id name="id" type="integer">
      <column name="id" />
      <generator class="native" />
      </id>
   2)内置管理策略
      a.increment:用于为long, short或者int类型生成 唯一标识  先查出最大的id,然后再插入, mysql使用increment不太好,会多一次查询,性能有所下降
      b.native:根据底层数据库的能力选择identity, sequence 或者hilo中的一个。
      c.identity:对DB2,MySQL, MS SQL Server, Sybase和HypersonicSQL的内置标识 ,字段提供支持.返回的标识符是long, short 或者int类型的。
      d.sequence :适用于支持序列的数据库,比如oracle, 在DB2,PostgreSQL, Oracle, SAP DB, McKoi中使用
      e.uuid:用一个128-bit的UUID算法生成字符串类型的标识符, 这在一个网络中是唯一的(使用了IP地址)。UUID被编码为一个32位16进制数字的字符串。
      f.assigned:让应用程序在save()之前为对象分配一个标示符。
                          这是 <generator>元素没有指定时的默认生成策略,让应用程序处理主键
      g.hilo/seqhilo :高/低位算法
      h.foreign:使用另外一个相关联的对象的标识符.
                   通常和<one-to-one>联合起来使用
   3)自定义主键管理策略
     班级号+学号(java01_20161229)
     编写主键生成器类:
     所有生成器都会实现org.hibernate.id.IdentifierGenerator;接口
      increment/identity/select/native/assigned...
  8.映射文件中使用的hibernate类型:
    hibernate类型指的是映射描述文件中<property>元素的type属性
   1)映射java基本类型以及封装类
     整数:byte/short/integer/long
     浮点型:float/double
     布尔型:boolean/yes_no/true_false
   2)映射字符串
      完成从java.lang.String到数据库中varchar/varchar2
   3)映射日期和事件
      完成从java.util.Date和java.sql.Date到数据库中
      date/time/timestamp
   4)映射日期
      java.util.Calendar-->calendar/calendar_date
   5)映射大数值
       从java.math.BigDecimal和java.math.BigInteger-->NUMERIC
      orcale-->number
      big_decimal-->big_integer
   6)映射JDBC
     JDBC 类 java.sql.Clob 和 java.sql.Blob的映射。
     clob:使用char来保存数据,保存xml文档
     blob:保存二进制数据,比如一张图片
   7)自定义类型

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在信号处理领域,DOA(Direction of Arrival)估计是一项关键技术,主要用于确定多个信号源到达接收阵列的方向。本文将详细探讨三种ESPRIT(Estimation of Signal Parameters via Rotational Invariance Techniques)算法在DOA估计中的实现,以及它们在MATLAB环境中的具体应用。 ESPRIT算法是由Paul Kailath等人于1986年提出的,其核心思想是利用阵列数据的旋转不变性来估计信号源的角度。这种算法相比传统的 MUSIC(Multiple Signal Classification)算法具有较低的计算复杂度,且无需进行特征值分解,因此在实际应用中颇具优势。 1. 普通ESPRIT算法 普通ESPRIT算法分为两个主要步骤:构造等效旋转不变系统和估计角度。通过空间平移(如延时)构建两个子阵列,使得它们之间的关系具有旋转不变性。然后,通过对子阵列数据进行最小二乘拟合,可以得到信号源的角频率估计,进一步转换为DOA估计。 2. 常规ESPRIT算法实现 在描述中提到的`common_esprit_method1.m`和`common_esprit_method2.m`是两种不同的普通ESPRIT算法实现。它们可能在实现细节上略有差异,比如选择子阵列的方式、参数估计的策略等。MATLAB代码通常会包含预处理步骤(如数据归一化)、子阵列构造、旋转不变性矩阵的建立、最小二乘估计等部分。通过运行这两个文件,可以比较它们在估计精度和计算效率上的异同。 3. TLS_ESPRIT算法 TLS(Total Least Squares)ESPRIT是对普通ESPRIT的优化,它考虑了数据噪声的影响,提高了估计的稳健性。在TLS_ESPRIT算法中,不假设数据噪声是高斯白噪声,而是采用总最小二乘准则来拟合数据。这使得算法在噪声环境下表现更优。`TLS_esprit.m`文件应该包含了TLS_ESPRIT算法的完整实现,包括TLS估计的步骤和旋转不变性矩阵的改进处理。 在实际应用中,选择合适的ESPRIT变体取决于系统条件,例如噪声水平、信号质量以及计算资源。通过MATLAB实现,研究者和工程师可以方便地比较不同算法的效果,并根据需要进行调整和优化。同时,这些代码也为教学和学习DOA估计提供了一个直观的平台,有助于深入理解ESPRIT算法的工作原理。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值