再次认识Hibernate(二)

来源:互联网 发布:Python log日志的级别 编辑:程序博客网 时间:2024/04/29 14:19

Hibernate的持久化类状态

持久化类:实体类  与数据库表建立了映射  Hibernate中的持久化类有三种状态

transient 瞬时态(临时态)

持久化对象没有唯一标识oid    没有纳入到session的管理

瞬时态 获得    Book book=new Book();

瞬时态 转换为  持久态    save(book)    saveOrUpdate();

瞬时态 转换为  脱管态    book.setId(1);  设置oid


persistent持久态 

持久化对象有唯一标识oid  已经纳入到session的管理

持久态的持久化对象具有自动更新数据库的能力(依赖于Hibernate的一级缓存)

持久态 获得    Book book= (Book) session.get(Book.class,1);   get/load()/find()/iterate()

持久态 转换为  瞬时态  delete(book)  删除态   不建议使用

持久态 转换为  脱管态  session.close();   close()/clear()/evict();


Detached 脱管态(离线态)

持久化对象有唯一标识oid  没有纳入到session的管理

托管态  转换为 持久态   session.update():  update()/saveOrUpdate()/lock()

托管态  转换为 瞬时态   book.setId(null);  


Hibernate一级缓存

   缓存:将数据库/硬盘文件中的数据 放到缓存中(内存中的一块空间)   再次使用时,不使用sql 可以直接从内存中获取

   优势:可以提升程序运行的效率  缓存是hibernate优化的一个手段

   

  一级缓存 Session级别的缓存 在Session的接口的实现中包含了一系列Java集合 Java集合构成了Session缓存  与session的生命周期一致 

   向一级缓存中存入数据的时候,放入一级缓存区和一级缓存快照区

   当更新一级缓存的数据的时候,事务提交,对比一级缓存区和一级缓存快照区,如果数据一致,不更新,数据不一致,自动更新数据库

    clear()   清空一级缓存中所有的对象

    evict(Object obj) 清空一级缓存中的某个对象

    flush() 刷出缓存  

    每间隔一段时间,session会执行一些必须的sql语句将内存中对象的状态同步到JDBC连接中,这个过程称之为flush  刷出  强制缓存与数据库一致 

    refresh(Object obj) 将快照区的数据重新覆盖一级缓存的数据

     设置一级缓存的刷出时机   setFlushMode()

    FlushMode.ALWAYS  每次查询都会刷出     

    FlushMode.AUTO  默认值  有些查询会刷出

    FlushMode.COMMIT 事务提交的时候 手动调用

    FlushMode.MANUAL 手动调用flush才会刷出

 在Hibernate实体类映射文件中 <class>标签中 设置  select-before-update="true"  在更新之前先去查询


HIbernate关联关系的映射

  实体之间的关系

 一对多   (如一个用户生成多个订单  每一个订单只属于一个用户)

   在多的一方 创建一个字段  作为外键    指向一   的主键

 多对多  (一个学生选择多门课程  一个课程也可以被多个学生选择)

   创建第三张表    中间表2个字段分别指向2个方向

 一对一(一个公司只能有一个注册地址  只能被一个公司使用)

   创建unique外键  双方通过主键进行关联

  

    创建实体类

    建立映射  配置集合set  

   一对多配置

  <set   name="orders">

    <key colunmn=" "></key>   用来描述一对多 多的一方外键的名称

    <one-to-many class=" ">多的一方 类路径

  </set>

  多对一配置

   <many-to-one name=" " column=" "class=" ">

    多对多配置

    <set name=students"table=" ">

      <key column=" "></key>  中间表 外键

       <many to many class=""column="">  

     </set>

   一对多和多对一产生的问题  双向维护 会产生多余的sql

    inverse="true"  一般情况下  一的乙方放弃外键的维护权 

  Hibernate级联操作

  级联:操作当前对象时,对其关联对象的处理   

  cascade="save-update" 保存和更新的时候使用级联

                    "delete"  删除的时候使用级联

                    "none"  不使用级联

                    "all" 除了孤子删除之外的所有级联

                    "delete-orphan" 孤子删除  一对多    多为父 一为子   父被删除   子也不存在

                    “all-delete-orphan” 包含孤子删除的所有级联

0 0
原创粉丝点击