代码之家  ›  专栏  ›  技术社区  ›  Brandon Yarbrough

Easy way to truncate all tables, clear first and second level hibernate cache?

  •  3
  • Brandon Yarbrough  · 技术社区  · 14 年前

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

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

    3 回复  |  直到 14 年前
        1
  •  5
  •   Pascal Thivent    14 年前

    对于数据库,请使用 SchemaExport tool to recreate the schema:

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

    For the 2nd level cache, get access to the underlying cache regions from the SessionFactory and evict everything:

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

    For the 1st level cache, well, simply get a new Session 或呼叫 session.clear() .

        2
  •  1
  •   Brandon Yarbrough    14 年前

    采用上面的Pascal方法,我在Spring中寻找创建SchemaUpdate对象的正确方法,并意识到我不需要这样做。相反,我只需要为Hibernate获取一个Spring的sessionFactory对象,并要求它删除/创建模式。结合帕斯卡的其他解决方案,我们得到:

    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”慢得多。不过,我还是喜欢不必重复自己的话。

        3
  •  1
  •   leedm777 om-nom-nom    14 年前

    看一看 Unitils . It has great support for database testing (使用dbunit)我们已经使用了很长一段时间。It's really flexible, so you can use it if you ever find the need to pre-load data into the database for particular unit tests.

    With Unitils, you'll create a dataset file ( empty-db.xml )表示空数据库:

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

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

    @DataSet("empty-db.xml")
    

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

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

    The up side, especially for a large schema, is that it's way faster than rebuilding the schema.