Hibernate 学习笔记

来源:互联网 发布:nuts二战知乎 编辑:程序博客网 时间:2024/05/02 04:33

Hibernate 学习记录【20120815】

     hibernate 配置  Helloword 【20120815
         1.到hibernate 官网上下载Hibernate 的jar ,hibernate-distribution-3.3.2.GA-dist.zip,hibernate-annotations-3.4.0.GA
         2. 新建项目,导入jar包,Hibernate3.jar,hibernate-distribution-3.3.2.GA\lib\required下的所有jar,以及hibernate-                         annotations- 3.4.0.GA 中的Hibernate-annotation.jar,lib下的,ejb3-persistence.jar,hibernate-commons-                                        annotation.jar,lib\test下的 hibernate- cllextions.jar
          3.创建hibernate.cfg.xml, 里面的配置到hibernate-distribution-3.3.2.GA-dist\hibernate-distribution-               
                3.3.2.GA\documentation\manual\zh-CN\html_single ,下的文档中copy 修改下即可, 
          4. 创建表,和实体类,配置实体类名.hbm.xml,里面的内容可在上述文件中copy , 修改即可,
     
     Hibernate annotation id 的配置方法【20120815
         annoation 联合主键的方法,
      1, @Id   @Embaddable
      2, @EmbaddedId
      3, @Id IdClass
      具体方法请查看annoation 文档

   Hibernate coreApI 【20120815
          三种状态:
  1. 瞬时: 内存中有 , 缓存中没有, 数据数中没有   没有id
  2. 持久状态: 内存中有, 缓存中有, 数据库中有, 有id
  3. 脱管状态: 内存中有, 缓存中没有, 数据库中有, 有id
   get  和 , load  区别,
  1.       不存在记录时, 表现不一样, load 不会报错, get 报异常。
  2.       load 返回的是代理对象,等到真正用到对象时,才会发送sql 语句
  3.       get 是直接发送sql 语句查询数据库, 而不会延迟,
  clear()方法,
  1.       无论是gat 还是load方法,首先都会去session缓存中去查找,如果没有才会去数据库中查找,调用clear()方法可   以强行清  除session 缓存                      
  2.      调用flush()方法,可以强行进行缓存和数据库同步
   Hibernate 关系映射【20120815
  1.      单项One2One @OneToOne @JoinColumn(name="指定外键的名称")
  2.      双向One2One   双方都加@OneToOne 
  3.           注意任意双向关联 必须的加 mappedBy 
  4.           One2One 双向 组合主键, @@OneToOne@JoinColumns ({
                 @JoinColumn (name="组合主键名称(自己定义)" ,referencedColumnName= "对应属性名称"),
                 @JoinColumn (name="组合主键名称(自己定义)" ,referencedColumnName= "对应属性名称")
          })
         当然不要忘了 组合主键的使用
  5.      hibernate的 联合组建,使用@Embedded
  6.      单项One2Many 一方用Set,@OneToMany @JoinCoiumn(name="") 
  7.      单项Many2One @ManyToOne @JoinColumn(name="")
  8.      双向Many2One 将单项和一起就OK, 记得在主控方加mappedBy, 一般多的一方作为主控方
  9.      单项Many2Many @ManyToMany 设置中间表  @JoinTable(name="中间表名" ,joinColumns={
                       @JoinColumn (name="当前表对应的字段名称" )},
          inverseJoinColumns={ @JoinColumn (name="与之对应的表的字段名称" )}
          
          )
  10.      双向ManyToMany 就是在两边都加 @ManyToMany ,记得加MappedBy
  11.        
Hibernate 查询
  1. NativeSQL>HQL>EJBQL(JQL)> QBC(Query by creitria) >QBE(Query by Example)
1+N问题
  1. 主要出现在OneToMany 中, 比喻,load 一个对象时,本只需一个select , 但是这个对象里面关联了另一个对象 这样就会额外的多发出N条语句,这就是1+N问题。
  2. 解决办法 a)Lazy b)batchsize c) Join fatch ,a ,c 用的比较多,
Iterator 和 list 的区别
  1. list在查询时一次性的全部取出所有数据 
    Iterator 先取出所有的ID , 等正真使用对象时在根据id去数据库中查
  2. list不会去查session缓存(一级缓存)中的值,但是它会默认往二级缓存中放数据,查询时也不使用二级缓存。
    Iterator 首先去sesion缓存中去查找,session缓存中没有去二级缓存中查,都没有才去数据库中去查找。
  3. 使用建议, 使用时可以用list , 二次使用时用可以用Iterator  ,更具情况而定
Hibernate 缓存
  1. 一级缓存,也称Session级别缓存。
  2. 二级缓存,也称SessionFactory缓存
  • 经常被访问的数据
  • 改动不大,不经常使用过修改的数据, 例如 , 用户的权限,组织机构等数据
  • 数量有限的数据
    Hibernate 使用
  • 在Hibernate.cfg.xml文件中添加打开二级缓存的配置
  • 添加二级缓存的特有的配置文件,并导入jar包。
  • 使用时使用注解@cahe 具体方法请查看KPI .
   3.三级缓存,也称查询缓存
  •     在Hibernate.cfg.xml中打开查询缓存,(依赖于二级缓存)
  •         设置使用查询缓存,用.setCacheable(true)
缓存的算法
  1. LRU:最近很少使用的(根据使用时间判断)
  2. LFU:最近不常用的(命中率高低)
  3. FIFO: 
事物
事物的特性ACUD:
  • A事物的原子性
  • C一致性
  • U独立性
  • D持久性
事物的并发
  1. 脏读:读到另一个事物没有提交的数据
  2. 不可从复读:同一事物两次读取的数据不一致
  3. 幻读:主要在插入和删除中出现
事物的隔离机制
  1. 1 read_uncommitted
    会出现:脏读,不可从复读,幻读
  2. 2 read_committed 
    会出现:不可从复读,幻读
  3. 4 repeatable read 
  4. 8 serializable 
    可解决所有问题
一般情况下会设置为 read_committed 
Hibernate 设置事物隔离机制方法:配置文件中加,Hibernate.comecion.isolation=2
一般设置为2 即 read_commintted。
解决不可从复读(一般不考虑幻读)可以用 乐观锁和悲观锁 ,
  • 悲观锁: 一个事物没有结束前别的事物不能修改,使用 在Load 中设置loadMode属性,具体可查API文档
  • 乐观锁:利用版本号来识别,使用,在实体类中加version 字段,并给该字段加@Version注解




0 0