有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java截断所有表的简单方法,清除一级和二级hibernate缓存?

我正在为我正在开发的Spring/Hibernate应用程序编写一些集成测试,我希望尽可能接近实际情况进行测试,包括使用Hibernate的二级缓存和提交事务

我想知道是否有一种有效的方法让Hibernate删除数据库和缓存中的所有内容。我能想到的最好方法是对每种类型的对象使用HQL“delete from XImpl”行,但我有几十个域对象,感觉应该有更好的方法


共 (3) 个答案

  1. # 1 楼答案

    看看Unitils。它非常支持database testing(使用DbUnit),我们已经使用了很长一段时间。它非常灵活,所以如果您发现需要将数据预加载到数据库中进行特定的单元测试,可以使用它

    使用Unitils,您将创建一个代表空数据库的数据集文件(empty-db.xml):

    <?xml version='1.0' encoding='UTF-8'?>
    <dataset>
      <obj1/>
      <obj2/>
    </dataset>
    

    在需要配置数据集的类或测试上

    @DataSet("empty-db.xml")
    

    对于所有持久性测试,我们都有一个通用的基类,所以我们能够将注释放在一个地方

    缺点是,每次向Hibernate添加实体时,都必须向该文件添加行。您必须获得正确的顺序才能与外键约束保持一致。最后,我们添加了一个单元测试来对照Hibernate配置检查该文件,以保持其处于检查状态

    好的一面,尤其是对于大型模式,是它比重建模式快得多

  2. # 2 楼答案

    对于数据库,使用SchemaExport工具重新创建模式:

    Configuration cfg = ....;
    new SchemaExport(cfg).create(false, true);
    

    对于二级缓存,从SessionFactory获取对底层缓存区域的访问,并逐出所有内容:

    SessionFactory sf = ...;
    Cache cache = sf.getCache();
    cache.evictEntityRegions();
    cache.evictCollectionRegions();
    cache.evictQueryRegions();
    

    对于一级缓存,只需获取一个新的Session或调用session.clear()

  3. # 3 楼答案

    采用上面Pascal的方法,我开始寻找在Spring中创建SchemaUpdate对象的正确方法,并意识到我不需要这样做。相反,我可以找到Spring的Hibernate sessionFactory对象,让它删除/创建模式。结合Pascal的其他解决方案,我们得到:

    LocalSessionFactoryBean localSessionFactoryBean = (LocalSessionFactoryBean)appContext.getBean("&sessionFactory");
    localSessionFactoryBean.dropDatabaseSchema();
    localSessionFactoryBean.createDatabaseSchema();
    Cache cache = sf.getCache();
    cache.evictEntityRegions();
    cache.evictCollectionRegions();
    cache.evictQueryRegions();
    

    这是相当有效的。唯一的缺点是(至少对我来说)它明显比在每个表名上调用“delete from obj1”、“delete from obj2”慢。尽管如此,我还是喜欢不必重复自己的话