文档章节

hibernate总结

CarlDing
 CarlDing
发布于 2016/06/27 15:08
字数 1224
阅读 30
收藏 0

Hibernate的核心:

类:

SessionFactory

Session

 

配置文件:

classpath:hibernate.cfg.xml

classpath:hibernate.properties - 可选的

 

缓存:

一级缓存 Session

二级缓存 SessionFactory 必须要使用ehcache框架 - ehcache.xml

 

查询

QBC/HQL/Native-SQL

 

对象状态:新建,瞬时,脱管

 

 

以下是具体操作

1:如何创建一个Hiberante的项目

   方式:

1:添加hiberante\lib\required中的所有包

2:maven

<dependency>

<groupId>org.hibernate</groupId>

<artifactId>hibernate-core</artifactId>

<version>5.1.0.Final</version>

</dependency>

 

 

2:如何使用Hibernate.cfg.xml文件连接数据库

     <property name="connection.driver_class">com.mysql.jdbc.Driver</property>

     <property name="connection.url">jdbc:///hib?characterEncoding=UTF-8</property>

    <property name="connection.username">root</property>

    <property name="connection.password">e23456</property>

 

 

3:如何使用c3p0连接数据库

     <dependency>

<groupId>com.mchange</groupId>

<artifactId>c3p0</artifactId>

<version>0.9.5.2</version>

</dependency>

 

在cfg.xml中添加c3p0的配置:

    <property name="hibernate.c3p0.max_size">3</property>

    <property name="hibernate.c3p0.timeout">3000</property>

 

 

4:如何创建一个表的单表的影射

1:先创建表 - 再创建Bean - 再创建hbm.xml - 添加到cfg.xml中。

2:先创建Bean - >再创建hbm.xml - >添加到cfg.xml中去。配置自动的生成表

<property name="hbm2ddl.auto">update</property>

3:使用反向工程

 

1:先使用eclipse连接数据库

 

第二步:使用Hiberante连接数据

 

 

 

<!-- 添加影射 -->

<mapping resource="cn/ql/domain/Studs.hbm.xml" />

 

5:更多影射

   组件影射 ?

   一对多

   多对多

   一对一

 

6:如何生成主键

 

 

7:如何进行CRUD

   Session.save/update/delete/

   Criteria/Query/SQLQuery

 

 

8:什么是一级缓存特点

 

 

9:如何配置二级缓存

   添加ehcache的包

   

  Maven:

  <!-- https://mvnrepository.com/artifact/org.hibernate/hibernate-ehcache -->

<dependency>

    <groupId>org.hibernate</groupId>

    <artifactId>hibernate-ehcache</artifactId>

    <version>5.1.0.Final</version>

</dependency>

 

添加ehcache.xml

<ehcache>

    <diskStore path="java.io.tmpdir"/>

    <defaultCache

        maxElementsInMemory="10000"

        eternal="false"

        timeToIdleSeconds="120"

        timeToLiveSeconds="120"

        overflowToDisk="true"

        />

</ehcache>

 

<!-- 打开二级缓存 -->

<!-- 打开二级缓存 -->

<property name="hibernate.cache.use_second_level_cache">true</property> <property name="hibernate.cache.region.factory_class">org.hibernate.cache.ehcache.EhCacheRegionFactory</property>

 

 

 

配置对哪一个类进行二级缓存

<!-- 配置对哪一个类进行二级缓存 -->

<class-cache usage="read-only" class="cn.ql.domain.Studs"/>

 

测试及统计是否命中了二级缓存:

Session s1 = HibernateUtils.openSession();

Studs studs1 = s1.get(Studs.class, "S002");

s1.close();

 

Session s2 = HibernateUtils.openSession();

Studs studs2 = s2.get(Studs.class, "S002");

s2.close();

 

测试后台只有一个SQL语句:

 

 

1:以下方法会删除二级缓存中的数据

Session.delete/update

 

<!-- 配置对哪一个类进行二级缓存 -->

<class-cache usage="read-write" class="cn.ql.domain.Studs" />

 

Session s1 = HibernateUtils.openSession();

Studs studs1 = s1.get(Studs.class, "S001");//select..

s1.close();

 

Session s3 = HibernateUtils.openSession();

Studs studs3 = s3.get(Studs.class, "S001");

s3.beginTransaction();

//studs3.setStudName("张三");

//s3.update(studs3);//update.. - 没有删除二级缓存中的数据,对二级缓存中的数据进行了更新操作.

s3.delete(studs3);

s3.getTransaction().commit();

s3.close();

 

Session s2 = HibernateUtils.openSession();

Studs studs2 = s2.get(Studs.class, "S001");//还是命中二级缓存

s2.close();

 

 

 

2:查询缓存

   Criteria/Query/SQLQuery -默认不会访问二级缓存。

 

配置打开查询的二缓存:

 

<!-- 打开查询缓存 -->

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

 

在代码上也设置当前的QBC/HQL可以访问二级缓存:

   Session s1 = HibernateUtils.openSession();

Studs studs1 = (Studs) s1.createCriteria(Studs.class)//

.add(Restrictions.idEq("S001"))//

.setCacheable(true)//可以访问二级缓存

.uniqueResult();

s1.close();

 

Session s3 = HibernateUtils.openSession();

s3.beginTransaction();

s3.createQuery("delete from Studs where id='S001'")

.setCacheable(true)//无论是否setCacheable都会删除放到二级缓存中的对象

.executeUpdate();

s3.getTransaction().commit();

s3.close();

 

 

 

Session s2 = HibernateUtils.openSession();

Studs studs2 = (Studs) s2.createCriteria(Studs.class)//

.add(Restrictions.idEq("S001"))//

.setCacheable(true)//可以访问二级缓存

.uniqueResult();

System.err.println("studs2 is:"+studs2);

s2.close();

 

 

3:集合缓存

<!-- 配置对集合进行缓存 -->

<collection-cache usage="read-only" collection="cn.ql.domain.Persons.cars"/>

 

 

<class-cache usage="read-write" class="cn.ql.domain.Cars"/>  对类进行缓存

<!-- 配置对集合进行缓存 -->

<collection-cache usage="read-only" collection="cn.ql.domain.Persons.carses"/> 只对集合中的对象的id进行缓存

 

 

 

4:缓存可以配置的位置

1:cfg.xml中同上

  建议.

 

2:在*.hbm.xml

 <class name="cn.ql.domain.Cars" table="cars">

     <cache usage="read-only"/>

 

3:注解

@Cache(usage=CacheConcurrencyStrategy.READ_WRITE)

public class Persons implements java.io.Serializable {

 

private String personId;

private String personName;

@Cache(usage=CacheConcurrencyStrategy.READ_WRITE)

 


5:缓存文件

 

 

<class-cache usage="read-write" class="cn.ql.domain.Studs" />

<class-cache usage="read-write" class="cn.ql.domain.Persons"/>

<class-cache usage="read-write" class="cn.ql.domain.Cars"/>

<!-- 配置对集合进行缓存 -->

<collection-cache usage="read-only" collection="cn.ql.domain.Persons.carses"/>

 

  <defaultCache

        maxElementsInMemory="10000"

        eternal="false"

        timeToIdleSeconds="120"

        timeToLiveSeconds="120"

        overflowToDisk="true"

        />

 

应该对每一个类都配置缓存

      <!-- 对某个一类进行缓存策略的配置 -->

      <cache name="cn.ql.domain.Persons"

       maxElementsInMemory="100"

        eternal="false"

        timeToIdleSeconds="120"

        timeToLiveSeconds="120"

        overflowToDisk="true"

        />

 

 

是否在hiberante中所有的类,都要示配置二级缓存:

  不行。

  应该只对哪些经常查询,但很少修改删除的对象进行二级缓存。

 

6: 缓存策略

 

 

1:read-only : 只读缓存。

 

Session s = HibernateUtils.openSession();

s.beginTransaction();

 

Studs studs = s.get(Studs.class, "S001");

studs.setStudName("Mary");

 

s.getTransaction().commit();

s.close();

 

[Can't write to a readonly object]

 

限制不了HQL:

@Test

public void test1() {

Session s = HibernateUtils.openSession();

s.beginTransaction();

 

s.createQuery("update Studs set studName='Simth' where studId='S001'")

.executeUpdate();

 

s.getTransaction().commit();

s.close();

}

 

2:读写缓存 read-write - 严格读写缓存

   将一个对象放到二级缓存中,但是会添加一个锁。

如果一个Session没有结束,其他的Session获取不到这个二级缓存中的对象:

  

@Test

public void test1() {

Session s = HibernateUtils.openSession();

Session s2 = HibernateUtils.openSession();

s.beginTransaction();

s2.beginTransaction();

 

Studs studs1 =  s.get(Studs.class,"S001");

 

boolean boo =

HibernateUtils.getSessionFactory()//

.getCache().containsEntity(Studs.class, "S001");

System.err.println("是否有这个对象:"+boo);//true

 

Studs studs2 =  s2.get(Studs.class,"S001");

 

 

s2.getTransaction().commit();

s2.close();

 

s.getTransaction().commit();

s.close();

}

 

 

3:nonstrict-read-write 非严格的读写

放到二级缓存中,不添加锁

 

(同上代码)

 

 


7:方言与分页

对于Hiberante的分页:

   <!-- 指定方言 -->

<property name="dialect">org.hibernate.dialect.SQLServer2005Dialect</property>

 

Mysql:

<!-- 指定方言 -->

<property name="dialect">org.hibernate.dialect.MySQL5Dialect</property>

 

Session s = HibernateUtils.openSession();

 

List list =  s.createCriteria(Studs.class)//

.setFirstResult(10)//limit start

.setMaxResults(10)//,end - pageSize

.list();

 

s.close();

 

 

 

 

 

 

© 著作权归作者所有

上一篇: AOP
CarlDing
粉丝 5
博文 106
码字总数 78103
作品 0
济南
其他
私信 提问
【持久化框架】Mybatis与Hibernate的详细对比

前言 这篇博文我们重点分析一下Mybatis与Hibernate的区别,当然在前面的博文中我们已经深入的研究了Mybatis和Hibernate的原理。 Mybatis 【持久化框架】Mybatis简介与原理 【持久化框架】Spr...

sietai
2018/05/18
143
0
分析总结Spring管理Hibernate中Dao层访问数据库常用方式(附SSH的jar包)

上篇博客中已经讲解Spring配置数据源的常用的几种方式。接下来本篇博客继续讲解。配置完数据源,那Dao层是如何访问数据库呢? 基于最近的项目使用SSH2框架完成,分析总结Spring与Hibernate集...

晨曦之光
2012/08/22
607
0
Hibernate 官方证实代码已移至 Github

昨天,来自 Github 网站的消息称入驻了 Hibernate 项目。此消息目前得到 Hibernate 官方的证实。来自 Hibernate 官方博客称目前 Hibernate Core 和 Validator 已经迁到 Git 上,而 Hibernat...

红薯
2010/10/14
2.4K
4
【Java框架】 Hibernate与Mybatis对比

Hibernate与Mybatis对比 今天同事跟我说现在的小规模公司很少用hibernate,大部分都用mybatis。平时也经常接触这两方面,正好最近不怎么忙,查看网上其他相关技术文档 ,梳理下Mybatis和Hib...

林元煌
2017/07/05
0
0
Hibernate 学习资料汇总

1.Hibernate系列——总结篇(http://blog.csdn.net/jiuqiyuliang/article/details/41318751) 2.Hibernate框架简述(http://www.cnblogs.com/eflylab/archive/2007/01/09/615338.html) 3.Hiber......

IT追寻者
2016/08/06
29
0

没有更多内容

加载失败,请刷新页面

加载更多

3_数组

3_数组

行者终成事
今天
7
0
经典系统设计面试题解析:如何设计TinyURL(二)

原文链接:https://www.educative.io/courses/grokking-the-system-design-interview/m2ygV4E81AR 编者注:本文以一道经典的系统设计面试题:《如何设计TinyURL》的参考答案和解析为例,帮助...

APEMESH
今天
7
0
使用logstash同步MySQL数据到ES

概述   在生成业务常有将MySQL数据同步到ES的需求,如果需要很高的定制化,往往需要开发同步程序用于处理数据。但没有特殊业务需求,官方提供的logstash就很有优势了。   在使用logstas...

zxiaofan666
今天
10
0
X-MSG-IM-分布式信令跟踪能力

经过一周多的鏖战, X-MSG-IM的分布式信令跟踪能力已基本具备, 特点是: 实时. 只有要RX/TX就会实时产生信令跟踪事件, 先入kafka, 再入influxdb待查. 同时提供实时sub/pub接口. 完备. 可以完整...

dev5
今天
7
0
OpenJDK之CyclicBarrier

OpenJDK8,本人看的是openJDK。以前就看过,只是经常忘记,所以记录下 图1 CyclicBarrier是Doug Lea在JDK1.5中引入的,作用就不详细描述了,主要有如下俩个方法使用: await()方法,如果当前线...

克虏伯
今天
8
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部