Hibernate框架深入





hibernate.cfg.xml基础配置

(一)基础配置介绍

   
   

        
<hibernate-configuration>   
       
    <session-factory>

        
           
        <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver property>   
            
        <property name="hibernate.connection.url">jdbc:mysql://localhost/hibernate hibernate>   
           
        <property name="hibernate.connection.username">root property>   
           
        <property name="hibernate.connection.password">123456 property>

           
        <property name="hibernate.connection.pool.size">20 property> 

           
        <property name="hibernate.show_sql">true property> 
        
        <property name="hibernate.format_sql">trueproperty>

           
        <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect property>   

        
        <property name="hibernate.hbm2ddl.auto">updateproperty>

           
        <property name="jdbc.fetch_size">50 property>   
           
        <property name="jdbc.batch_size">23 property>   

           
        <property name="jdbc.use_scrollable_resultset">false property> 

           
        <property name="Connection.useUnicode">true property>   

           
        <property name="connection.characterEncoding">utf-8property>        


                  
        <mapping resource="org/hibernate/entity/User.hbm.xml">   

    session-factory>   



(二)hibernate对连接池的支持

在hibernate.properties中有 c3p0 Connection Pool的配置


        <property name="hibernate.connection.provider_class">org.hibernate.connection.C3P0ConnectionProviderproperty>
        

        
        <property name="hibernate.c3p0.min_size">2property>
        
        <property name="hibernate.c3p0.max_size">4property>
        
        <property name="hibernate.c3p0.timeout">5000property>
        
        <property name="hibernate.c3p0.max_statements">10property>
        
        <property name="hibernate.c3p0.idle_test_period">30000property>
        
        <property name="hibernate.c3p0.acquire_increment">2property>



(三)hibernate二级缓存

基于应用程序级别的缓存,可以让不同的session访问。hibernate提供的二级缓存有默认的实现,且是一种可插配的缓存框架。如果用户想用二级缓存,只需要在hibernate.cfg.xml中配置即可。
也可以使用其他的缓存框架,或者自己实现缓存框架。

Hibernate的二级缓存作为一个可插入的组件在使用的时候也是可以进行配置的,但并不是所有的对象都适合放在二级缓存中。在通常情况下会将具有以下特征的数据放入到二级缓存中:

  • 很少被修改的数据
  • 不是很重要的数据,允许出现偶尔并发的数据
  • 不会被并发访问的数据
  • 参考数据

缓存的范围分为3类:
(1)事务范围(单Session即一级缓存)
事务范围的缓存只能被当前事务访问,每个事务都有各自的缓存,缓存内的数据通常采用相互关联的对象形式.缓存的生命周期依赖于事务的生命周期,只有当事务结束时,缓存的生命周期才会结束.事务范围的缓存使用内存作为存储介质,一级缓存就属于事务范围.
(2)应用范围(单SessionFactory即二级缓存)
应用程序的缓存可以被应用范围内的所有事务共享访问.缓存的生命周期依赖于应用的生命周期,只有当应用结束时,缓存的生命周期才会结束.应用范围的缓存可以使用内存或硬盘作为存储介质,二级缓存就属于应用范围.
(3)集群范围(多SessionFactory)
在集群环境中,缓存被一个机器或多个机器的进程共享,缓存中的数据被复制到集群环境中的每个进程节点,进程间通过远程通信来保证缓存中的数据的一致,缓存中的数据通常采用对象的松散数据形式.


1、二级缓存组件

Hibernate内置支持的二级缓存组件如表所示
Hibernate框架深入_第1张图片

集群缓存的概念:
当一台服务器上的执行了update方法修改了一条数据,那么只有这一台服务器上的二级缓存会同步于数据库,其他服务器上的二级缓存里面这条数据就没意义了。这个时候用OSCache缓存机制,只要有一台服务器上有数据修改了,马上会从配置文件中找到配置好的其他服务器IP地址,进行广播,告诉他们我这条数据修改了,你们也更新同步一下。


2、开启二级缓存

在hibernate.cfg.xml文件中配置


        
        <property name="hibernate.cache.use_second_level_cache">trueproperty>

        
        <property name="hibernate.cache.provider_class">org.hibernate.cache.HashtableCacheProviderproperty>

        
        <property name="hibernate.cache.use_query_cache">trueproperty>
        
        <class-cache usage="read-write" class="cn.itcast.b_second_cache.Dept"/>
        <class-cache usage="read-only" class="cn.itcast.b_second_cache.Employee"/>

        
        <collection-cache usage="read-write" collection="cn.itcast.b_second_cache.Dept.emps"/>

          
        <property name="hibernate.cache.use_structured_entries">trueproperty>  
          
        <property name="hibernate.generate_statistics">trueproperty>  

PS:也可以在映射中配置二级缓存

<class name="Dept" table="dept">
    
    <cache usage="read-only"/>

    

    <set>
        
        <cache usage="read-only"/>

           
    set>
class>

查询缓存
list()方法获取到的数据会放入缓存当中,但是再次调用却不会从缓存中获取数据。
使用查询缓存,就可以让list()方法从二级缓存中获取数据。
//这样会先去二级缓存中查找数据
Query q = session.createQuery(“from User”).setCacheable(tru



(四)Hibernate3中持久化对象的状态

1、瞬时对象(Transient Objects)

使用new操作符初始化的对象不是立刻就持久化的,他们的状态是瞬时的。

  • (1) 不处于Session的缓存中,也可以说,不被任何一个Session实例关联。
  • (2) 在数据库中没有对应的记录。


2、持久化对象(Persist Objects)

持久实例是任何具有数据库标识的实例。它有持久化管理器Session统一管理,持久实例是在事务中进行操作的。他们的状态在事务结束时同数据库进行同步。

  • (1) 位于一个Session实例的缓存中,也可以说,持久化对象总是被一个Session实例关联。
  • (2) 持久化对象和数据库中的相关记录对应。
  • (3) Session在清理缓存时,会根据持久化对象的属性变化,来同步更新数据库。


3、离线对象(Detached Objects)

Session关闭之后,持久化对象就变为离线对象。离线表示这个对象不能再与数据库保持同步,他们不再受Hibernate管理。

  • (1) 不再位于Session的缓存中,也可以说,游离对象不被Session关联。
  • (2) 游离对象是由持久化对象转变过来的,因此在数据库中可能还存在与它对应的记录

Hibernate框架深入_第2张图片





映射文件

(一)映射文件简单介绍



<hibernate-mapping 
    package="org.hibernate.entity">

    
    <class name="User" table="user">


        
        <id name="id">
            
            <generator class="native"/>
        id>


        
        <property name="name" column="name">property>
        <property name="birthday" column="birthday" type="">property>

    class>
hibernate-mapping>

PS:
①主键生长策略
Hibernate框架深入_第3张图片

②java类型与hibernate类型的比较
Hibernate框架深入_第4张图片
Hibernate框架深入_第5张图片





hibernate映射





hibernate注解

正向工程和逆向工程

你可能感兴趣的:(Hibernate框架深入)