1,Hibernate 缓存简介
Hibernate中提供了 二级缓存,一级缓存是Session级别的缓存,它属于事物范围的缓存,该缓存由Hibernate管理,程序无需干涉,二级缓存是SessionFactory级别的缓存该缓存可以配置和更改,是一种可插配的缓存框架,如果用户想使用则在主配置文件hibernate.cfg.xml配置即可,不想使用则直接移除即可。因为SessionFactory对象的生命周期和整个应用过程相对应,所以不同的session都可以访问该缓存中的数据。
2,Hibernate 二级缓存的详细配置
1,导入所需的jar包
hibernate-release-5.2.12.Final包中的lib文件夹下required文件夹中的所有jar包和optional文件夹中ehcache文件夹的所有jar包和相应的数据库驱动包。如下图:
2,Major类设计
package reflect_one_many;
import java.util.HashSet;
import java.util.Set;
public class Major {
private int majorId;
private String majorName;
private Set<Student> stu = new HashSet<Student>();
public int getMajorId() {
return majorId;
}
public void setMajorId(int majorId) {
this.majorId = majorId;
}
public String getMajorName() {
return majorName;
}
public void setMajorName(String majorName) {
this.majorName = majorName;
}
public Set<Student> getStu() {
return stu;
}
public void setStu(Set<Student> stu) {
this.stu = stu;
}
}
3.Major类映射文件配置
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="reflect_one_many">
<class name="Major" table="major" >
<id name="majorId" column="majorId">
<generator class="native"/>
</id>
<property name="majorName" column="majorName" type="string" length="20"/>
<set name="stu" table="student" inverse="false" cascade="save-update">
<key column="majorId"></key>
<one-to-many class="Student" />
</set>
</class>
</hibernate-mapping>
4,主配置文件hibernate.cfg.xml的配置
<!-- 二级缓存配置 -->
<!--开启二级缓存 -->
<property name="hibernate.cache.use_second_level_cache">true</property>
<!-- 指定使用哪一个缓存框架 -->
<property name="hibernate.cache.region.factory_class">org.hibernate.cache.ehcache.EhCacheRegionFactory</property>
<!-- 开启查询缓存 -->
<property name="hibernate.cache.use_query_cache">true</property>
<!-- 指定哪些类要加入二级缓存 -->
<class-cache usage="read-write" class="reflect_one_many.Major"/>
<class-cache usage="read-write" class="reflect_one_many.Student"/>
<!-- 集合缓存 -->
<collection-cache usage="read-only" collection="reflect_one_many.Major.stu"/>
5,二级缓存的案列
@Test
public void cacheDemo() {
Session session = sessionFactory.openSession();
Transaction tx = session.beginTransaction();
Major major = session.get(Major.class, 1);
System.out.println(major);
tx.commit();
session.close();
System.out.println("====================");
Session session1 = sessionFactory.openSession();
Transaction tx1 = session1.beginTransaction();
Major major2 = session1.get(Major.class, 1);
System.out.println(major2);
tx1.commit();
session1.close();
}
6,结果如图所示