Hibernate

简介:

Hibernate

1.orm思想

Object relational mapping:对象关系映射

让实体类和数据库表进行一一对应

不需要直接操作数据库表,而操作表对应的实体类对象。


2.缓存

什么是缓存

1 数据存到数据库里面,数据库本身是文件系统,使用流方式操作文件效率不是很高。

(1)把数据存到内存里面,不需要使用流方式,可以直接读取内存中数据

(2)把数据放到内存中,提供读取效率

 

Hibernate缓存

1 hibernate框架中提供很多优化方式,hibernate的缓存就是一个优化方式

 

2 hibernate缓存特点:

第一类 hibernate的一级缓存

1hibernate的一级缓存默认打开的

2hibernate的一级缓存使用范围,是session范围,从session创建到session关闭范围

3hibernate一级缓存中,存储数据必须 持久态数据

 

第二类 hibernate的二级缓存

1)目前已经不使用了,替代技术 redis

2)二级缓存默认不是打开的,需要配置

3)二级缓存使用范围,是sessionFactory范围

 

01-一级缓存执行过程

 

wKioL1l1wUGQv-m0AACk1w7-KBs787.png-wh_50


02-一级缓存快照区执行

 wKioL1l1wUOR5BVRAADdmQ_Q57g446.png-wh_50

3.No session问题

联系人列表功能

1 查询所有的联系人,显示每个联系人所属的客户名称

 

wKiom1l1wUPBzcZsAAAHa3Q0p7Y280.png-wh_50

wKioL1l1wUPQ_kOtAAAHMsYu5SE637.png-wh_50

 

2 列表功能中有no session问题

 wKiom1l1wUSABhPQAAAD_jpyCjo985.png-wh_50

 wKiom1l1wUThDWFBAAB237-OCGg641.png-wh_50

(1)no session解决:

- 让session操作之后不会马上关闭,在action操作之后进行关闭

- 封装实现方式:让session延迟关闭

 

(2)具体使用

封装过滤器,只需要配置封装的过滤器就可以了

配置到struts2过滤器前面


wKioL1l1wUXgITVtAABRb1IrqLM644.png-wh_50

wKioL1l1wUXCxxi2AAAHL5j8HpY411.png-wh_50

wKiom1l1wUaB2nq-AAAGbxOLxwM243.png-wh_50

 

还有的问题:


wKiom1l1wUbAKYQgAABIElYwpzY525.png-wh_50

 

4.核心配置文件

Hibernate.cfg.xml

<hibernate-mapping package="com.my.qb.domain">

   <class name="Dept" table="DEPT_P">

      <id name="id" column="DEPT_ID">

         <generator class="uuid"></generator>

      </id>

      <property name="deptName" column="DEPT_NAME"></property>

      <property name="state" column="STATE"></property>

     

      <!-- 自关联  子部门与父部门  多对一 -->

      <many-to-one name="parent" class="Dept" column="PARENT_ID"></many-to-one>

      

      <!-- private Set<User> users  = new HashSet<User>(0);//部门与用户  一对多 -->

      <set name="users">

         <key column="DEPT_ID"></key>

         <one-to-many class="User"/>

      </set>

   </class>

</hibernate-mapping>

5.主键生成策略

assigned

 让应用程序在save()之前为对象分配一个标示符。这是 <generator>元素没有指定时的默认生成策略。

sequence

 DB2,PostgreSQL, Oracle, SAP DB, McKoi中使用序列(sequence), 而在Interbase中使用生成器(generator)。返回的标识符是long, short或者 int类型

identity

 DB2,MySQL, MS SQL Server, SybaseHypersonicSQL的内置标识字段提供支持。 返回的标识符是long, short 或者int类型的

uuid

 用一个128-bitUUID算法生成字符串类型的标识符, 这在一个网络中是唯一的(使用了IP地址)。UUID被编码为一个3216进制数字的字符串

6.hiberante框架特点? 与JDBC操作进行对比

 1. 使用hql开发,比使用SQL开发,开发简单、效率高

 2. hql是面向实体对象的语言,数据库的迁移性好 (可以同时支持多种数据库)

 3. hibernate程序的运行效率低,jdbc的运行效率高

   A、数据库openSession时速度慢

   Bhql转换成sql时,需要消耗性能

   Chql的开发习惯,一次提取记录的所有字段信息进行映射;

    sql的习惯是,需要哪些字段就提取哪些字段;

 4. hibernate有懒加载特性


7.Hibernate对象状态(object states)

Hibernate定义并支持下列对象状态(state): 


瞬时(Transient) - 由new操作符创建,且尚未与Hibernate Session 关联的对象被认定为瞬时(Transient)的。瞬时(Transient)对象不会被持久化到数据库中,也不会被赋予持久化标识(identifier)。 如果瞬时(Transient)对象在程序中没有被引用,它会被垃圾回收器(garbage collector)销毁。 使用Hibernate Session可以将其变为持久(Persistent)状态。(Hibernate会自动执行必要的SQL语句) 


持久(Persistent) - 持久(Persistent)的实例在数据库中有对应的记录,并拥有一个持久化标识(identifier)。 持久(Persistent)的实例可能是刚被保存的,或刚被加载的,无论哪一种,按定义,它存在于相关联的Session作用范围内。 Hibernate会检测到处于持久(Persistent)状态的对象的任何改动,在当前操作单元(unit of work)执行完毕时将对象数据(state)与数据库同步(synchronize)。 开发者不需要手动执行UPDATE。将对象从持久(Persistent)状态变成瞬时(Transient)状态同样也不需要手动执行DELETE语句。 


脱管(Detached) - 与持久(Persistent)对象关联的Session被关闭后,对象就变为脱管(Detached)的。 对脱管(Detached)对象的引用依然有效,对象可继续被修改。脱管(Detached)对象如果重新关联到某个新的Session上, 会再次转变为持久(Persistent)的(在Detached其间的改动将被持久化到数据库)。 这个功能使得一种编程模型,即中间会给用户思考时间(user think-time)的长时间运行的操作单元(unit of work)的编程模型成为可能。 我们称之为应用程序事务,即从用户观点看是一个操作单元(unit of work)。 


总结:

    所谓的Hibernate对象状态,指的是hiberante的映射对象(有映射关系存在)

    

    持久(Persistent): 实体对象通过hibernate写入到数据库后,就称为持久态 

              1. 要有持久化标识  (主键) ,数据库中要有对应的对象

              2. 这个对象要与session关联

    脱管(Detached) :  所谓的托管对象就是脱离了hibernate的session管理

              场景:把一个对象写入数据库,然后关闭session,这时对象就称为了托管对象;

            1. 要有持久化标识  (主键), 数据库中要有对应的对象

            2. 这个对象不要与session关联

    瞬时(Transient):

            1. 这个对象只是内存对象,数据库中没有映射对象

            2. 这个对象不要与session关联 



本文转自 叫我北北 51CTO博客,原文链接:http://blog.51cto.com/qinbin/1950537
相关文章
|
3月前
|
Java 数据库连接 API
|
12月前
|
SQL Java 关系型数据库
Hibernate的使用总结
Hibernate的使用总结
61 0
|
SQL 存储 Java
Hibernate
Hibernate
66 0
|
SQL Java 关系型数据库
|
Java 数据库连接
|
关系型数据库 Java 数据库连接
|
SQL Java 数据库连接