`
jinnianshilongnian
  • 浏览: 21434990 次
  • 性别: Icon_minigender_1
博客专栏
5c8dac6a-21dc-3466-8abb-057664ab39c7
跟我学spring3
浏览量:2405130
D659df3e-4ad7-3b12-8b9a-1e94abd75ac3
Spring杂谈
浏览量:2997788
43989fe4-8b6b-3109-aaec-379d27dd4090
跟开涛学SpringMVC...
浏览量:5631528
1df97887-a9e1-3328-b6da-091f51f886a1
Servlet3.1规范翻...
浏览量:257583
4f347843-a078-36c1-977f-797c7fc123fc
springmvc杂谈
浏览量:1593212
22722232-95c1-34f2-b8e1-d059493d3d98
hibernate杂谈
浏览量:248982
45b32b6f-7468-3077-be40-00a5853c9a48
跟我学Shiro
浏览量:5847622
Group-logo
跟我学Nginx+Lua开...
浏览量:698184
5041f67a-12b2-30ba-814d-b55f466529d5
亿级流量网站架构核心技术
浏览量:780495
社区版块
存档分类
最新评论

测试jpa时需要注意的二级缓存

 
阅读更多

 

最近写集成测试来测试一个实体+集合缓存的程序,单独执行没有问题,一旦多个测试用例一起执行会造成从第二个出现可能加载到第一个测试用例集合的内容。

 

测试用例:

第一个测试用例:

1、通过加载sql装载:

User#1

   farms 

      Farm#1

      Farm#2

2、接下来执行没有问题;

 

第二个测试用例:

1、通过加载sql装载:

User#1

   farms 

      Farm#3

      Farm#4

      Farm#5

2、接着调用jpa的:

entityManager.getEntityManagerFactory().getCache().evictAll(); 清空二级缓存;

entityManager.clear(); 清空一级缓存

3、接下来会发现:

User#1 得到的farms还是 Farm#1、Farm#2 而没有新装载的,也就是得到第一个测试用例的。

 

这是为什么呢?

因为jpa没有集合缓存的概念,而是hibernate里特有的,因此entityManager.getEntityManagerFactory().getCache().evictAll();  只清空实体缓存,而实体对应的集合缓存还是存在的,因此不会查数据库获取最新的。。。

 

jpa Cache相关的概念可参考http://en.wikibooks.org/wiki/Java_Persistence/Caching

 

hibernate jpa cache的实现代码如下(org.hibernate.ejb.EntityManagerFactoryImpl.JPACache):

public void evictAll() {
    sessionFactory.getCache().evictEntityRegions();
    // TODO : if we want to allow an optional clearing of all cache data, the additional calls would be:
    //sessionFactory.getCache().evictCollectionRegions();
    //sessionFactory.getCache().evictQueryRegions();
}

 

那就找能删除集合缓存的api吧,entityManager.getEntityManagerFactory().getCache()中是没有的。。咋办? 此时只能获取hibernate的SessionFactory 然后清空二级缓存了。

 

因此写了个工具类:

/**
 * Copyright (c) 2005-2012 https://github.com/zhangkaitao
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 */
package com.sishuok.es.common.repository.hibernate;

import org.hibernate.Cache;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.ejb.HibernateEntityManagerFactory;

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;

/**
 * 根据 jpa api 获取hibernate相关api
 * <p>User: Zhang Kaitao
 * <p>Date: 13-5-23 下午6:24
 * <p>Version: 1.0
 */
public class HibernateUtils {

    /**
     * 根据jpa EntityManager 获取 hibernate Session API
     * @param em
     * @return
     */
    public static Session getSession(EntityManager em) {
        return (Session) em.getDelegate();
    }

    /**
     * 根据jpa EntityManager 获取 hibernate SessionFactory API
     * @see #getSessionFactory(javax.persistence.EntityManagerFactory)
     * @param em
     * @return
     */
    public static SessionFactory getSessionFactory(EntityManager em) {
        return getSessionFactory(em.getEntityManagerFactory());
    }

    /**
     * 根据jpa EntityManagerFactory 获取 hibernate SessionFactory API
     * @param emf
     * @return
     */
    public static SessionFactory getSessionFactory(EntityManagerFactory emf) {
        return ((HibernateEntityManagerFactory)emf).getSessionFactory();
    }

    /**
     * 根据 jpa EntityManager 获取hibernate Cache API
     * @see #getCache(javax.persistence.EntityManagerFactory)
     * @param em
     * @return
     */
    public static Cache getCache(EntityManager em) {
        return getCache(em.getEntityManagerFactory());
    }

    /**
     * 根据jpa EntityManagerFactory 获取 hibernate Cache API
     * @param emf
     * @return
     */
    public static Cache getCache(EntityManagerFactory emf) {
        return getSessionFactory(emf).getCache();
    }

    /**
     * 清空一级缓存
     * @param em
     */
    public static void clearLevel1Cache(EntityManager em) {
        em.clear();
    }

    /**
     * 根据jpa EntityManager 清空二级缓存
     * @see #clearLevel2Cache(javax.persistence.EntityManagerFactory)
     * @param em
     */
    public static void clearLevel2Cache(EntityManager em) {
        clearLevel2Cache(em.getEntityManagerFactory());
    }

    /**
     * 根据jpa EntityManagerFactory 清空二级缓存 包括:
     * 1、实体缓存
     * 2、集合缓存
     * 3、查询缓存
     * 注意:
     *  jpa Cache api 只能evict 实体缓存,其他缓存是删不掉的。。。
     *  @see org.hibernate.ejb.EntityManagerFactoryImpl.JPACache#evictAll()
     *
     * @param emf
     */
    public static void clearLevel2Cache(EntityManagerFactory emf) {
        Cache cache = HibernateUtils.getCache(emf);
        cache.evictEntityRegions();
        cache.evictCollectionRegions();
        cache.evictDefaultQueryRegion();
        cache.evictQueryRegions();
        cache.evictNaturalIdRegions();
    }
}

 

此时可以调用clearLevel2Cache清空二级缓存的所有内容。

 

相关阅读:

混合jpa和jdbc集成测试时Connection第二次执行sql时被关闭原因及解决方案

4
5
分享到:
评论
3 楼 jizi7618937 2015-09-16  
/**
     * 根据jpa EntityManagerFactory 获取 hibernate SessionFactory API
     *
     * @param emf
     * @return
     */
    public static SessionFactory getSessionFactory(EntityManagerFactory emf) {
        return ((HibernateEntityManagerFactory) emf).getSessionFactory();
    }

这段代码有问题。
java.lang.ClassCastException: com.sun.proxy.$Proxy76 cannot be cast to org.hibernate.ejb.HibernateEntityManagerFactory

这是在es项目里面报的。
2 楼 jinnianshilongnian 2013-05-24  
xusheng87 写道

害苦我了 
1 楼 xusheng87 2013-05-24  

相关推荐

    Spring3.2_Hibernate4.2_JPA2全注解实例

    Spring3.2 Hibernate4.2 JPA2全注解实例.采用JTA事务管理,配置ehcache为二级缓存,在glassfish3.2.2和postgresql9测试通过。参考网上的资料整理。

    DWR3.0_Spring3.2_Hibernate4.2_JPA全注解实例

    DWR3.0 Spring3.2 Hibernate4.2 JPA全注解实例。采用JTA事务管理,配置ehcache为二级缓存,在glassfish3.2.2和postgresql9测试通过。参考网上的资料整理。.

    zxframe demo.rar

    支持多层次缓存:本地一级缓存,本地全局二级缓存,远程缓存,查询缓存,方法级别缓存 *.支持缓存融入事务,业务异常不提交缓存数据 *.支持通用分布式锁 *.支持全服务热更新配置 *.支持服务运行状态和日志查询,便于...

    蝙蝠在线考试系统v2.2.6 JSF2+SPRING+JPA

    本系统采用JAVA技术构建,中间层与数据访问层采用了SPRING框架和EclipseLink框架,采用了数据库二级缓存技术、大并发数据访问支持能力卓越,这种能力在多用户同时考试生成试卷和同时提交试卷并计算得分时非常重要,...

    Struts2 + Spring3 + Hibernate3.5 整合(集成测试配套jar包更新构建脚本使用说明)

    此项目整合了目前主流和最前源的web开发技术:采用ehcache实现二级缓存(包含查询缓存);用sf4j及logback(log4j的升级版)记录日志;proxool(据说是dbcp和c3p0三者中最优秀的)做连接池;使用jquery的ajax实现仿...

    springboot+javaee+javaee企业级开发,实验1-6

    实验一、j2EE开发环境搭建及测试 实验二、文件上传下载功能实现 实验三、Excel数据文件数据库导入导出 实验四、后台管理:登录Login开发 实验五、人事管理:邮件发送(rabbitmq)发送端开发 实验六、人事管理:邮件...

    spring2.5学习PPT 传智博客

    spring2.5学习PPT 传智...为Spring集成的Hibernate配置二级缓存 30.Spring提供的CharacterEncoding和OpenSessionInView功能 31.使用Spring集成JPA 32.Struts+Spring+JPA集成 33.使用Spring集成Struts2 34.所有源码

    Java高手真经 高级编程篇 下载(二)

     Java Web开源技术与框架:包括工作流、规则引擎、搜索引擎、缓存引擎、任务调度、身份认证、报表服务、系统测试、集群与负载均衡。  随书附赠光盘内容为本书各种原型包、系统源程序。本书内容循序渐进,通俗易懂...

    Hibernate实战(第2版 中文高清版)

     13.4.5 控制二级高速缓存   13.5 小结   第14章 利用HQL和JPA QL查询   14.1 创建和运行查询   14.1.1 准备查询   14.1.2 执行查询   14.1.3 使用具名查询   14.2 基本的HQL和JPA QL查询   14.2.1...

    Java高手真经 高级编程篇 下载(四)

     Java Web开源技术与框架:包括工作流、规则引擎、搜索引擎、缓存引擎、任务调度、身份认证、报表服务、系统测试、集群与负载均衡。  随书附赠光盘内容为本书各种原型包、系统源程序。本书内容循序渐进,通俗易懂...

    Java高手真经 高级编程篇 下载(一)

     Java Web开源技术与框架:包括工作流、规则引擎、搜索引擎、缓存引擎、任务调度、身份认证、报表服务、系统测试、集群与负载均衡。  随书附赠光盘内容为本书各种原型包、系统源程序。本书内容循序渐进,通俗易懂...

    Java高手真经 高级编程篇 下载(三)

     Java Web开源技术与框架:包括工作流、规则引擎、搜索引擎、缓存引擎、任务调度、身份认证、报表服务、系统测试、集群与负载均衡。  随书附赠光盘内容为本书各种原型包、系统源程序。本书内容循序渐进,通俗易懂...

    finance-master汇尚电子商务商品管理系统.zip

    二级小分类 品牌表 地区表 品牌月行汇总表 品牌月列汇总表 汇总行合计表 汇总列合计表 财务费用类别表 财务费用类别二级小类 店铺消费金额明细表 店铺消费金额主表 原始文件记录表 导入文件日志表 商品决策系统: ...

    Spring in Action(第2版)中文版

    1.3.3企业级应用中的依赖注入 1.4应用aop 1.4.1aop介绍 1.4.2aop使用 1.5小结 第2章基本bean装配 2.1容纳你的bean 2.1.1beanfactory介绍 2.1.2使用应用上下文 2.1.3bean的生命 2.2创建bean 2.2.1声明一个...

    Spring in Action(第二版 中文高清版).part2

    1.3.3 企业级应用中的依赖注入 1.4 应用AOP 1.4.1 AOP介绍 1.4.2 AOP使用 1.5 小结 第2章 基本Bean装配 2.1 容纳你的Bean 2.1.1 BeanFactory介绍 2.1.2 使用应用上下文 2.1.3 Bean的生命 2.2 创建Bean ...

    Spring in Action(第二版 中文高清版).part1

    1.3.3 企业级应用中的依赖注入 1.4 应用AOP 1.4.1 AOP介绍 1.4.2 AOP使用 1.5 小结 第2章 基本Bean装配 2.1 容纳你的Bean 2.1.1 BeanFactory介绍 2.1.2 使用应用上下文 2.1.3 Bean的生命 2.2 创建Bean ...

    Spring面试题

    7. 表字段要少,表关联不要怕多,有二级缓存撑腰 7. Struts工作机制?为什么要使用Struts? 工作机制: Struts的工作流程: 在web应用启动时就会加载初始化ActionServlet,ActionServlet从 struts-config.xml文件中...

    JavaEE开发的颠覆者SpringBoot实战[完整版].part2

    3.6.2 第二类:依据条件选择配置类 64 3.6.3 第三类:动态注册Bean 65 3.7 测试 66 3.7.1 点睛 66 3.7.2 示例 67 第二部分 点睛Spring MVC 4.x 第4 章 Spring MVC 基础 72 4.1 Spring MVC 概述 73 4.2 Spring MVC ...

    JavaEE开发的颠覆者SpringBoot实战[完整版].part3

    3.6.2 第二类:依据条件选择配置类 64 3.6.3 第三类:动态注册Bean 65 3.7 测试 66 3.7.1 点睛 66 3.7.2 示例 67 第二部分 点睛Spring MVC 4.x 第4 章 Spring MVC 基础 72 4.1 Spring MVC 概述 73 4.2 Spring MVC ...

Global site tag (gtag.js) - Google Analytics