Hibernata的特点

来源:互联网 发布:git mac客户端 编辑:程序博客网 时间:2024/05/01 04:29
  • Hibernata是一种开放源代码的对象/关系映射持久层框架。
  • 事务处理,生命周期管理不依赖于J2EE容器。
  • 解决数据库的方言问题。
  • hibernata只需要操作对象就可以完成数据库的增,删,改,查。使用hibernata更面向对象。
  • 轻量级,无侵入性,移植性好。
  • ssh:
  • struts:撑杆
  • hibernate:冬眠
  • spring:春天
  • hibernate不适用批量对对象进行操作,使用数据库特定映射,表间关系很复杂时,会造成性能问题。
  • 主键生成策略
  • increment自动增长,其主键由hibernate控制,数据库中相应的字段没有设置自动增长,不能用于集群。
  • identity自动增长,对DB2,MYsql,sql server数据库中相应的字段设置自动增长。
  • sequence对Oracle数据库中相应的字段设置自动增长
  • UUID采用UUID算法生成字符串唯一标识,UUID生成策略相对来说速度较快,不需要使用数据库相关的维护表的操作,但查找相对较慢。
  • native根据数据库底层的描述,决定采用dentity,sequence中的一个
  • assigned受冻分配主键,当generator没有设置时,采用这种方式。
  • select使用触发器分配主键。
  • foreign使用另外一个相关联的对象的标识符。通常和<one-to-noe>联合起来使用。
  • oracle序列添加主键生成策略
  • <id name=“custld”>
  •           <generator class=“sequence”>
  •             S_CUST_ID为序列名称
  •                   <param name=“sequence”>S_CUST_ID</param>
  •           </generator>
  • </id>
  • 对象状态
  • Transient(瞬时状态)当生成po对象时产生,数据库中没有相应的纪录,没有session对其进行管理。
  • persistent(持久状态)当session对象调用saveorupdate()时,数据库中有与之对应的纪录,有session对象对之进行管理,当PO对象的值发生变化时,session对象让数据库记录与之同步。
  • Detached(游离状态)当session事务提交时,数据库中有与之对应的纪录,从session一级缓存中清除,session对其不再进行管理。
  • hibernate中get和load的区别
  • 1,get为立即加载,调用get方法时,会马上执行sql将结果查询出来。load为延迟加载,调用load方法时,不回马上查询结果。而是当查询处来的对象在使用时,才会发出SQL语句查询结果。
  • 2,当查询的主键不存在时,get方法返回null,load会抛出”对象未找到异常“。
  • org.hibernate.LazyInitializationException: could not initialize proxy - no Session(延迟加载)。一旦查询的对象不使用,不会真正查询数据库。这时,如果session关闭,再使用查询的对象,那么就会抛出该异常。
  • 数据库一对一有两种关系
  • 主键关联:从表的主键,同时又是主表的外键。从表没有dandy的外键列。
  • 外键关联:从表中存在外键列,关联主表的主键列。但外键列是不重复的。
  • 级联操作(all,none,delete,save-update)当当前对象执行某操作的情况下,其关联的对象也执行cascade  设置同样操作。
  • cascade和inverse的区别
  • cascade表示级联操,当主表纪录做操作时,从表纪录做相应的操作,维护的是纪录。
  • inverse表示控制反转。当该属性设置为true时,表示由关联对象维护外键关系,当前对象不做外键维护,维护的是外键。一般来说,inverse设置在一方,外键由从表维护。
  • 缓存
  • 缓存就是数据库在内存中的临时容器。
  • 位于数据库与数据库访问层中间。
  • ORM在查询数据时首先会根据自身的缓存管理策略,在缓存中查找相关数据,如发现所需的数据,则直接将此数据作为结果加以利用。
  • 避免了数据库调用性能的开销。
  • 相对内存操作而言,数据库调用是一个代价高昂的过程。
  • 缓存分类
  • 一级缓存:即在当前事务范围内的数据缓存。如果查询同一个数据,将会在缓存中去找,只有session关闭之后才会重新调用数据库。
  • 应用级(二级)缓存:即在某个应用中或某个独立数据库访问子集中的共享缓存,此缓存可由多个事物共享。
  • 分布式缓存:即在多个应用实例,多个JVM间共享的缓存策略。
  • Hibernate的延迟加载
  • 在右关联的持久类对象中,对一个对象进行的查询也会向另一个对象进行查询。
  • 所谓延迟加载就是当在真正需要数据的时候,才真正执行数据加载操作。
  • 延迟加载类型:1,实体对象的延迟加载(load())  2,集合的延迟加载(一对多和多对多时,关联集合)   3,属性的延迟加载(clob大数据类型时)。
  • club  存放大文本的类型。
  • blob 存放二进制的类型。
  • Hibernate 的悲观荷乐观锁
  • 多个用户可能同时读取或者更新一个数据
  • 需要一些机制来保证这些数据载摸个操作过程中不会被外界修改,这样的机制,也就是所谓的“锁”,即给我们选定的目标数据上锁,使其无法被其他程序修改。
  • Hibernate支持两种锁机制    -’悲观锁’(Pessimistic Locking)   -‘乐观锁’(Optimistic Locking).
  • Read UnCommited没有提交,就能读到。
  • insert,在没有提交的时候就能更新数据库。
  • Read Commited提交读。提交之后,才可以更新数据库。不存在脏读。存在不可重复读。如果一个用户读出是张三,另一个用户改为李四,name第一个用户再读则是李四。存在虚读,用户查询数据时,两次查询的内容不一致未提交的写事务将会禁止其他事务访问该行。
  • 悲观锁
  • 每次在存取数据的时候,其他用户也会存取同一数据
  • 对数据进行 锁定,知道自己操作完成以后
  • 依靠数据库提供的锁机制
  • 实现依赖于数据库机制,在整个过程中,将数据库锁定,其他任何用户不能对其读取和修改,一般适合于短事务,并发性好。
  • 乐观锁
  • 悲观锁保证操作独占性,性能开销巨大
  • 乐观锁依靠数据库版本纪录机制实现
  • 为数据库增加一个版本标示,增加一个version字段。
  • 读取数据时,将版本号一同读出。
  • 更新时,版本号加一。
  • 将提交数据的版本与数据库表对应纪录的当前版本信息进行比对。
  • 如果提交的数据,版本号大于数据库表当前版本号,则予以更新,否则认为是过期数据。
1 0
原创粉丝点击