清空所有表格、清除一级和二级 Hibernate 缓存的简便方法是什么?

3
我正在为我正在开发的Spring/Hibernate应用程序编写一些集成测试,并且希望尽可能接近真实条件进行测试,其中包括使用Hibernate的二级缓存和提交事务。
我想知道是否有一种有效的方法可以要求Hibernate从数据库和缓存中删除所有内容。我能想到的最好的方法是针对每种类型的对象使用HQL“delete from XImpl”语句,但我有几十个领域对象,感觉应该有更好的方法。
3个回答

5

对于数据库,使用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()即可。


SchemaExport!太棒了--我会在周一尝试。 - Brandon Yarbrough

1
采用Pascal上述的方法,我开始寻找在Spring中创建SchemaUpdate对象的正确方式,并意识到我并不需要这样做。相反,我可以获取Hibernate的Spring 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”明显慢。不过,我喜欢不必重复自己。


1

看看Unitils。它对数据库测试(使用DbUnit)有很好的支持,我们已经使用了相当长的时间。它非常灵活,因此您可以在需要为特定单元测试预加载数据到数据库时使用它。

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

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

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

@DataSet("empty-db.xml")

我们为所有持久性测试都有一个共同的基类,因此我们能够将注释放在一个地方。

缺点是每次向Hibernate添加实体时,您都必须向此文件添加行。而且,您必须正确排序以与外键约束一致。最终,我们添加了一个单元测试来检查此文件与Hibernate配置的一致性。

优点是,特别是对于大型模式,它比重新构建模式要快得多。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接