对hibernate的简单理解,未完待续

版权声明:代码共享,欢迎copy https://blog.csdn.net/qq_29073921/article/details/82624536

一、hibernate的理解

百度百科:

        hibernate是一个开源的ORM(对象关系映射)框架。ORM即object-relation mapping,它的作用就是在关系型数据库和对象之间做了一个映射,从对象映射到关系,在从关系映射到对象。这样我们在操作数据库的时候,不需要再去和复杂的sql打交道,只要想操作对象一样的操作它就可以了(把关系型数据库的字段在内存中映射成对象的属性)。

图中可看出hibernate有六大核心接口。两个主要配置文件,以及他们直接的关系,简单认识

1、Configuration接口:负责配置并启动hibernate

2、SessionFactory接口:负责初始化hibernate

3、Session接口:负责持久化对象的CURD操作

4、Transaction接口:负责事务

5、Query和Criteria接口:负责执行各种数据库查询

注意“Configuration实例是启动期间的对象,一旦Session Factory创建完成它就被丢弃了

        使用Hibernate的基本流程是:配置Configuration对象、产生SessionFactory、创建session对象,启动事务,完成CRUD操作,提交事务,关闭session。

         在应用Hibernate时,重点要了解Session的缓存原理,级联,延迟加载和hql查询。

优点:

1、更加对象化。以对象的思维操作数据库,只需要操作对象就可以了,开发更加对象化

2、移植性。hibernate做了持久层的封装,你就不知道数据库,你写的所有的代码都具有可复用性

3、hibernate是一个没有侵入性的框架,没有侵入性的框架称为轻量级框架。对比struts的Action和ActionForm,都是需要继承,离不开struts,hibernate不需要继承任何类,不需要实现任何借口,这样的对象叫:POJO对象。

4、hibernate测试方便,提高效率和生产力

缺点:

1、使用数据库特性的语句,将很难调优

2、对大批量数据更新存在问题

3、系统中存在大量的攻击查询功能

Hibernate缓存机制

一级缓存(Session缓存)

        又称session缓存,hibernate内置的,不可卸载的

1、Session的save()方法持久一个对象后,该对象加入到Session的缓存中,以后即使应用程序中的引用变量不再引用改对象,只要session的缓存没有被清空,该对象任然处于生命周期

2、挡Session的get()方法试图从数据库中加载对象时,Session优先判断缓存是否存在该对象,如果存在,则不需要去 数据库中检索

对象缓存是在内存中的

作用

1、减少数据库的访问次数, 
2、保证缓存和数据库的一致性。当缓存的对象变化后,不会马上执行sql ,这使得Session能把几条相关的sql 合并成一条sql 来执行

Session清理缓存

清理缓存是指按照缓存的中对象的属性变化来同步更新数据库 
清理缓存的时间点 
1、调用commit(),commit()方法先清理缓存,然后再向数据库提交事物 
2、调用Query查询接口等执行查询操作时候,如果缓存中持久化了对象的属性变化,就会先清理缓存,以保证查询结果为最新 
3、显示调用Session的flush()方法的时候

如何清除一级缓存?

  通过session.clear();//清除所有缓存

    session.evict();//清除指定缓存

二级缓存(SessionFactory缓存)

  由于SessionFactory对象的生命周期和应用程序的整个过程对应,因此Hibernate二级缓存是进程范围或者集群范围的缓存,有可能出现并发问题,因此需要采用适当的并发访问策略,该策略为被缓存的数据提供了事务隔离级别。

  save、update、saveOrupdate、load、get、list、query、Criteria方法都会填充二级缓存

  get、load、iterate会从二级缓存中取数据session.save(user)   

  如果user主键使用“native”生成,则不放入二级缓存.

  第二级缓存是可选的,是一个可配置的插件,默认下SessionFactory不会启用这个插件。Hibernate提供了org.hibernate.cache.CacheProvider接口,它充当缓存插件与Hibernate之间的适配器。

Hibernate的二级缓存策略的一般过程如下:
    
1) 条件查询的时候,总是发出一条select * from table_name where …. (选择所有字段)这样的SQL语句查询数据库,一次获得所有的数据对象。
    2) 把获得的所有数据对象根据ID放入到第二级缓存中。
    3) 当Hibernate根据ID访问数据对象的时候,首先从Session一级缓存中查;查不到,如果配置了二级缓存,那么从二级缓存中查;查不到,再查询数据库,把结果按照ID放入到缓存。
    4) 删除、更新、增加数据的时候,同时更新缓存。
  Hibernate的二级缓存策略,是针对于ID查询的缓存策略,对于条件查询则毫无作用。为此,Hibernate提供了针对条件查询的查询缓存(Query Cache)。

如何清除二级缓存?

  需要用SessionFactory来管理二级缓存

什么样的数据适合存放到第二级缓存中?   
  1) 很少被修改的数据   
  2) 不是很重要的数据,允许出现偶尔并发的数据   
  3) 不会被并发访问的数据   
  4) 常量数据   
不适合存放到第二级缓存的数据?   
  1) 经常被修改的数据   
  2) 绝对不允许出现并发访问的数据,如财务数据,绝对不允许出现并发   
  3) 与其他应用共享的数据。

二、hibernate的使用

为什么使用Hibernate框架?

原因如下:

  • Hibernate对JDBC访问数据库的代码做了封装,大大简化了数据访问层繁琐的重复性代码。
  • Hibernate是一个基于JDBC的主流持久化框架,是一个优秀的ORM实现,它很大程度的简化了dao层编码工作。

总结:Hibernate是企业级开发中的主流框架,映射的灵活性很出色。它支持很多关系型数据库

Hibernate提供了3.x 、4.x、 5.x版本

https://sourceforge.net/projects/hibernate/files/hibernate-orm/5.0.7.Final/

2.1、注解开发

常用注解:

@Entity

作用:指定当前类是实体类。写上此注解用于在创建SessionFactory/EntityManager时,加载映射配置。

@Table

作用:指定实体类和表之间的对应关系。

属性:

name:指定数据库表的名称

@Id

作用:指定当前字段是主键。

@GeneratedValue

作用:指定主键的生成方式。JPA的主键生成方式详解见2.4小节的说明。

属性:

strategy :指定主键生成策略。JPA支持四种生成策略,具体介绍看2.4小节。

@Column

作用:指定实体类属性和数据库表之间的对应关系

属性:

name:指定数据库表的列名称。

unique:是否唯一  
nullable:是否可以为空  
inserttable:是否可以插入  
updateable:是否可以更新  
columnDefinition: 定义建表时创建此列的DDL  
secondaryTable: 从表名。如果此列不建在主表上(默认建在主表),该属性定义该列所在从表的名字。  

一对多关系映射:

    常用注解

         1.@OneToMany

      作用:

                建立一对多的关系映射

      属性:

                  targetEntityClass:指定多的方的类的字节码

                  mappedBy:指定从表实体类中引用主表对象的名称。

                  cascade:指定要使用的级联操作

                  fetch:指定是否采用延迟加载

                  orphanRemoval:是否使用孤儿删除

            @ManyToOne

            作用:

                  建立多对一的关系

            属性:

                  targetEntityClass:指定一的一方实体类字节码

                  cascade:指定要使用的级联操作

                  fetch:指定是否采用延迟加载

                  optional:关联是否可选。如果设置为false,则必须始终存在非空关系。

      @JoinColumn

            作用:

                  用于定义主键字段和外键字段的对应关系。

            属性:

                  name:指定外键字段的名称

                  referencedColumnName:指定引用主表的主键字段名称

                  unique:是否唯一。默认值不唯一

                  nullable:是否允许为空。默认值允许。

                  insertable:是否允许插入。默认值允许。

                  updatable:是否允许更新。默认值允许。

                  columnDefinition:列的定义信息。

 

 

联系hibernate的一级缓存,熟悉对象的三种状态。

Hibernate框架为了更好管理持久化类,将持久化类分成了三种状态:

  1. 瞬时态 :没有持久化标识OID,没有被session操作管理。
  2. 持久态 :有持久化标识OID,已经被session操作管理。
  3. 脱管态(离线态) :有持久化标识OID,没有被session操作管理。

猜你喜欢

转载自blog.csdn.net/qq_29073921/article/details/82624536