Hibernate是当今主流的java持久层的框架之一,是一个开源的ORM框架,它对JDBC进行了轻量级的对象封装。
orm映射文件
hibernate-mapping标签
class标签及其子标签
配置实体与表中的对应关系的
generator字标签
用于设置主键的生成策略,配置class属性可以配置不同的主键生成策略
property标签
hibernate.cfg.xml的配置信息
com.mysql.jdbc.Driver
jdbc:mysql:///db_hbm
root
123456
org.hibernate.dialect.MySQL5Dialect
true
true
true
org.hibernate.cache.ehcache.EhCacheRegionFactory
ehcache.xml
--- 查询数据: session.get(类名.class,id)
---增加数据: session.save(对象)
---删除数据: session.delete(对象)
---修改数据: session.update(对象)
hibernate对象的状态
----hibernate中的对象有3种状态,分别为瞬时状态,持久态,托管态
public void demo01(){
User user = new User(); //瞬时态
user.setUsername("jack");
user.setPassword("1234"); //瞬时态(与oid没有关系)
Session session = factory.openSession();
session.beginTransaction();
session.save(user); //持久态
//---- 持久态就应该有持久态的行为(特性)
// user.setUsername("rose"); //持久态对象 被修改后,hibernate将自动生成update语句
// session.flush();
session.getTransaction().commit();
session.close();
System.out.println(user); //脱管态
public void demo03(){
//清除缓存
Session session = factory.openSession();
session.beginTransaction();
User user = (User) session.get(User.class, 1); //--select
System.out.println(user);
//清除
//session.clear();
session.evict(user);
// 一级缓存没有缓存对象,从数据库直接查询
User user2 = (User) session.get(User.class, 1); //--select
System.out.println(user2);
session.getTransaction().commit();
session.close();
}
Hibernate中提供了 二级缓存,一级缓存是Session级别的缓存,它属于事物范围的缓存,该缓存由Hibernate管理,程序无需干涉,二级缓存是SessionFactory级别的缓存该缓存可以配置和更改,是一种可插配的缓存框架,如果用户想使用则在主配置文件hibernate.cfg.xml配置即可,不想使用则直接移除即可。因为SessionFactory对象的生命周期和整个应用过程相对应,所以不同的session都可以访问该缓存中的数据。
1) 条件查询的时候,总是发出一条select * from table_name where …. (选择所有字段)这样的SQL语句查询数据库,一次获得所有的数据对象。
2) 把获得的所有数据对象根据ID放入到第二级缓存中。
3) 当Hibernate根据ID访问数据对象的时候,首先从Session一级缓存中查;查不到,如果配置了二级缓存,那么从二级缓存中查;查不到,再查询数据库,把结果按照ID放入到缓存。
4) 删除、更新、增加数据的时候,同时更新缓存。 Hibernate的二级缓存策略,是针对于ID查询的缓存策略,对于条件查询则毫无作用。为此,Hibernate提供了针对条件查询的Query Cache。
适合放入二级缓存的数据: 可以缓解数据库的压力 很少被修改 不是很重要的数据,允许出现偶尔的并发问题
不适合放入二级缓存的数据: 经常被修改 财务数据,绝对不允许出现并发问题 与其他应用数据共享的数据
Hibernater 的二级缓存是一个插件,下面是几种常用的缓存插件:
l EhCache:可作为进程范围的缓存,存放数据的物理介质可以是内存或硬盘,对Hibernate的查询缓存提供了支持。
l OSCache:可作为进程范围的缓存,存放数据的物理介质可以是内存或硬盘,提供了丰富的缓存数据过期策略,对Hibernate的查询缓存提供了支持。
l SwarmCache:可作为群集范围内的缓存,但不支持Hibernate的查询缓存。
l JBossCache:可作为群集范围内的缓存,支持事务型并发访问策略,对Hibernate的查询缓存提供了支持
1.导入optional文件夹中ehcache文件夹的所有jar包
2.创建一个 ehcache.xml 的配置文件,来配置缓存信息(从etc文件夹中拷贝一份)
3.在hibernate.cfg.xml配置文件中配置二级缓存的属性
4.开启二级缓存 如果使用xml配置,需要在.hbm.xml中添加
如果使用annotation配置,我们需要在Student这个类上加上这样一个注解 @Cache(usage=CacheConcurrencyStrategy.READ_ONLY) 表示开启二级缓存,并使用read-only策略 二级缓存的使用策略一般有这几种:read-only、nonstrict-read-write、read-write、transactional。注意:我们通常使用二级缓存都是将其配置成 read-only ,即我们应当在那些不需要进行修改的实体类上使用二级缓存,否则如果对缓存进行读写的话,性能会变差,这样设置缓存就失去了意义
可以给每个实体类指定一个对应的缓存,如果没有匹配到该类,则使用这个默认的缓存配置
maxElementsInMemory 在内存中存放的最大对象数
eternal 是否永久保存缓存,设置成false
timeToLiveSeconds的定义是:以创建时间为基准开始计算的超时时长;
timeToIdleSeconds的定义是:在创建时间和最近访问时间中取出离现在最近的时间作为基准计算的超时时长;
如果仅设置了timeToLiveSeconds,则该对象的超时时间=创建时间+timeToLiveSeconds,假设为A;
如果没设置timeToLiveSeconds,则该对象的超时时间=max(创建时间,最近访问时间)+timeToIdleSeconds,假设为B;
如果两者都设置了,则取出A、B最少的值,即min(A,B),表示只要有一个超时成立即算超时。