Hibernate中的高级特性

来源:互联网 发布:天津工业大学网络教学 编辑:程序博客网 时间:2024/05/18 00:03

Hibernate的核心配置文件

在src下创建一个hibernate.cfg.xml

<?xml version="1.0" encoding="utf-8"?><hibernate-configuration>   <session-factory>     <!-- 必须去配置的属性 -->      <!-- 配置数据库连接的基本信息: -->      <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>      <property name="hibernate.connection.url">jdbc:mysql:///hibernate3_day01</property>      <property name="hibernate.connection.username">root</property>      <property name="hibernate.connection.password">123</property>      <!-- Hibernate的方言 -->      <!-- 生成底层SQL不同的 -->      <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>      <!-- 可选的属性 -->      <!-- 显示SQL -->      <property name="hibernate.show_sql">true</property>      <!-- 格式化SQL -->      <property name="hibernate.format_sql">true</property>      <!-- hbm:映射 to DDL: create drop alter -->      <property name="hibernate.hbm2ddl.auto">update</property>      <!-- 通知Hibernate加载那些映射文件 -->      <mapping resource="cn/itcast/hibernate3/demo1/Customer.hbm.xml"/>    <!--可选的配置:    hibernate.show_sql  true 在控制台上输出SQL语句    hibernate.format_sql  true  格式化控制台输出的SQL语句    hibernate.connection.autocommit  true 事务是否自动提交    hibernate.hbm2ddl.auto  create/create-drop/update/validate    * create        :每次执行的时候,创建一个新的表.(如果以前有该表,将该表删除重新创建.) 一般测试的时候的使用.    * create-drop   :每次执行的时候,创建一个新的表,程序执行结束后将这个表,删除掉了.  一般测试的时候使用.    * update        :如果数据库中没有表,创建一个新的表,如果有了,直接使用这个表.可以更新表的结构.    * validate      :会使用原有的表.完成校验.校验映射文件与表中配置的字段是否一致.不一致报错.-->     <!--在Hibernate中使用c3p0连接池:    * 引入c3p0的jar包    * 在核心配置中添加一段配置:    <!-- C3P0连接池设定-->    <!-- 使用c3po连接池  配置连接池提供的供应商-->    <!--<property name="connection.provider_class">org.hibernate.connection.C3P0ConnectionProvider                                                                                                                                           </property>    <!--在连接池中可用的数据库连接的最少数目 -->    <!--<property name="c3p0.min_size">5</property>    <!--在连接池中所有数据库连接的最大数目  -->    <!--<property name="c3p0.max_size">20</property>    <!--设定数据库连接的过期时间,以秒为单位,    如果连接池中的某个数据库连接处于空闲状态的时间超过了timeout时间,就会从连接池中清除 -->    <!--<property name="c3p0.timeout">120</property>     <!--每3000秒检查所有连接池中的空闲连接 以秒为单位-->    <!--<property name="c3p0.idle_test_period">3000</property>-->  </session-factory> </hibernate-configuration>

创建ORM的映射文件

映射文件只要是一个XML格式文件就可以.名字任意.
* 通常情况下名称规范:
* 实体类名称.hbm.xml

<?xml version="1.0" encoding="utf-8"?><!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"><hibernate-mapping>   <!-- 建立类与表的映射 -->    <!-- class标签:用于映射类与表的关系 name :类的全路径  table:表名称 -->    <class name="cn.itcast.hibernate3.demo1.Customer" table="customer">     <!-- 建立类中属性与表中的字段映射 -->      <!-- 唯一标识 -->      <!-- 使用id的标签 配置唯一属性 -->      <!-- 在<id>标签中配置一个主键的生成策略. -->      <id name="id" column="id">       <generator class="native"/>     </id>      <!-- 普通属性 -->      <!-- property标签:映射类中的普通属性 name:类中的属性名称, column:表中字段名称 -->      <!--             type:三种写法                * Java类型        :java.lang.String                * Hibernate类型   :string                * SQL类型     :不能直接使用type属性,需要子标签<column>                    * <column name="name" sql-type="varchar(20)"/>         -->      <property name="name" column="name" type="string"/>      <property name="age" column="age"/>   </class> </hibernate-mapping>

使用Demo

//向数据库中插入一条记录@Test    // 向数据库中插入一条记录    public void demo1(){        // 1.Hiberante框架加载核心配置文件(有数据库连接信息)        Configuration configuration = new Configuration().configure();        // 2.创建一个SessionFactory.(获得Session--相当连接对象)        SessionFactory sessionFactory = configuration.buildSessionFactory();        // 3.获得Session对象.        Session session = sessionFactory.openSession();        // 4.默认的情况下,事务是不自动提交.        Transaction tx = session.beginTransaction();        // 5.业务逻辑操作        // 向数据库中插入一条记录:        Customer customer = new Customer();        customer.setName("任童");        customer.setAge(28);        session.save(customer);        // 6.事务提交        tx.commit();        // 7.释放资源        session.close();        sessionFactory.close();    }

CRUD操作

保存记录

session.save(customer);

根据主键进行查询

Customer customer = (Customer)session.get(Customer.class ,1);Customer customer = (Customer)session.load(Customer.class,1);

修改记录

session.update(customer);//修改有两种方式 :// 5.1手动创建对象的方式Customer customer = new Customer();customer.setId(2);customer.setName("苍老师");session.update(customer);//这种方式如果没有设置的属性,将这个属性的默认值存入了.(不好.)//先查询在修改的方式(推荐方式)Customer customer = (Customer) session.get(Customer.class, 1);customer.setName("凤姐");session.update(customer);

删除记录

session.delete(customer);删除记录有两种方式://手动创建对象的方式Customer customer = new Customer();customer.setId(2);session.delete(customer);//先查询再删除的方式Customer customer = (Customer)session.get(Customer.class, 1);session.delete(customer);

查询所有

HQL:HQL:Hibernate Query Language.面向对象的写法:Query query = session.createQuery("from Customer where name = ?");query.setParameter(0, "苍老师");Query.list();QBC:Query By Criteria.(条件查询)Criteria criteria = session.createCriteria(Customer.class);criteria.add(Restrictions.eq("name", "凤姐"));List<Customer> list = criteria.list();SQL:SQLQuery query = session.createSQLQuery("select * from customer");List<Object[]> list = query.list();SQLQuery query = session.createSQLQuery("select * from customer");query.addEntity(Customer.class);List<Customer> list = query.list();

Hibernate的抓取策略

从一的一方关联多的一方:

  • <set>
  • fetch:控制sql语句的类型
  • join :发送迫切左外连接的SQL查询关联对象.fetch=”join”那么lazy被忽略了.
  • select :默认值,发送多条SQL查询关联对象.
  • subselect :发送子查询查询关联对象.(需要使用Query接口测试)

  • lazy:控制关联对象的检索是否采用延迟.

  • true :默认值, 查询关联对象的时候使用延迟检索
  • false :查询关联对象的时候不使用延迟检索.
  • extra :及其懒惰.

* 如果fetch是join的情况,lazy属性将会忽略.

在多的一方关联一的一方:

  • <many-to-one>
  • fetch:控制SQL语句发送格式
  • join :发送一个迫切左外连接查询关联对象.fetch=”join”,lay属性会被忽略.
  • select :发送多条SQL检索关联对象.
  • lazy:关联对象检索的时候,是否采用延迟
  • false :不延迟
  • proxy :使用代理.检索订单额时候,是否马上检索客户 由Customer对象的映射文件中上lazy属性来决定.
  • no-proxy :不使用代理

获取线程绑定的session

  • 在Hibernate.cfg.xml中配置一个:
    thread
  • 使用SessionFactory中的getCurrentSession();方法.
  • 底层就是ThreadLocal.
  • 当前线程中的session不需要进行关闭,线程结束后自动关闭!

Hibernate一级缓存

一级缓存中快照区

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

管理一级缓存

一级缓存是与session的生命周期相关的.session生命周期结束,一级缓存销毁了.
* clear()/evict()/flush()/refresh()管理一级缓存.
* clear() :清空一级缓存中所有的对象.
* evict(Object obj) :清空一级缓存中某个对象.
* flush() :刷出缓存.
* refresh(Object obj):将快照区的数据重新覆盖了一级缓存的数据.

Hibernate二级缓存

二级缓存分区

1、类级别二级缓存区域
2、集合级别二级缓存区域
3、时间戳缓存区域

适合放入二级缓存中的数据:

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

不适合放入二级缓存中的数据:

  • 经常被修改
  • 财务数据, 绝对不允许出现并发问题
  • 与其他应用数据共享的数据

配置Ehcache缓存

1、拷贝ehcache-1.5.0.jar到当前工程的lib目录下,依赖 backport-util-concurrent 和 commons-logging
2、开启二级缓存

<property name="hibernate.cache.use_second_level_cache">true</property>

3、指定缓存的供应商

<property name="hibernate.cache.provider_class">org.hibernate.cache.EhCacheProvider</property

4、配置缓存哪些实体类
在hibernate.cfg.xml文件中配置(建议)

<class-cache class="cn.itcast.c3p0.Customer" usage="read-write"/><class-cache class="cn.itcast.c3p0.Order" usage="read-write"/><!-- 配置集合级别的二级缓存 --><collection-cache  collection="cn.itcast.c3p0.Customer.orders" usage="read-write"/>

5、配置ehcache默认的配置文件ehcache.xml(名字固定)(放在类路径下)

<diskStore path="D:\cache" /><cache name=""              maxElementsInMemory="10000"             eternal="true"           overflowToDisk="true"           maxElementsOnDisk="10000000"            diskPersistent="false"           diskExpriyThreadIntervalSeconds="120" /></ehcache>

cache元素的属性
name:设置缓存的名字,它的取值为类的全限定名或类的集合的名字
maxElementsInMemory :设置基于内存的缓存中可存放的对象最大数目
eternal:设置对象是否为永久的,true表示永不过期,此时将忽略timeToIdleSeconds 和 timeToLiveSeconds属性; 默认值是false
timeToIdleSeconds:设置对象空闲最长时间,以秒为单位, 超过这个时间,对象过期。当对象过期时,EHCache会把它从缓存中清除。如果此值为0,表示对象可以无限期地处于空闲状态。
timeToLiveSeconds:设置对象生存最长时间,超过这个时间,对象过期。 如果此值为0,表示对象可以无限期地存在于缓存中. 该属性值必须大于或等于 timeToIdleSeconds 属性值
overflowToDisk:设置基于内在的缓存中的对象数目达到上限后,是否把溢出的对象写到基于硬盘的缓存中
diskPersistent 当jvm结束时是否持久化对象 true false 默认是false
diskExpiryThreadIntervalSeconds 指定专门用于清除过期对象的监听线程的轮询时间
memoryStoreEvictionPolicy - 当内存缓存达到最大,有新的element加入的时候, 移除缓存中element的策略。默认是LRU(最近最少使用),可选的有LFU(最不常使用)和FIFO(先进先出)

Hibernate查询缓存

查询缓存依赖于二级缓存
查询缓存可以缓存属性!!!!
对于希望启用查询缓存的查询语句, 调用 Query 的 setCacheable(true) 方法

hibernate 配置文件中启用查询缓存

<property name=“hibernate.cache.use_query_cache">true</property>
0 0
原创粉丝点击