【问题标题】:How to execute sql-script file using hibernate?如何使用休眠执行 sql-script 文件?
【发布时间】:2010-01-15 12:38:04
【问题描述】:

我将编写几个集成测试来测试与 db 的交互。 对于每个测试,我需要有一个特定的 db 快照。每个数据库快照保存在 .sql 文件中。 我想要的是在某些测试方法中执行某些脚本文件,如下所示:

@Test
public void test_stuff(){
   executeScript(finame.sql);

   ... testing logic ...

   clean_database();
}

hibernate 有办法做到这一点吗?

【问题讨论】:

    标签: unit-testing hibernate import sql-scripts


    【解决方案1】:
    • 你可以在hibernate启动时自动执行SQL脚本:将你的SQL命令写在一个名为import.sql的文件中,并放在CLASSPATH的根目录下。

    • 您无需为测试清理数据库,只需将您的测试设为事务性并在每次测试结束时回滚即可。因此,您确信您的数据库没有被您的测试污染。例如,使用 Spring:

      @Transactional
      @TransactionConfiguration
      public class MyTest {
      ...
      }
      

    如果您不使用 Spring,请尝试支持默认回滚事务的测试框架。

    【讨论】:

    • Rod Johnson 谈到了使用事务和回滚来进行集成测试:infoq.com/presentations/system-integration-testing-with-spring 如果您已经熟悉测试的原因,可以跳到 30 分钟。
    • 有趣但有点老了:作者谈到使用 AbstractTransactionnal 进行测试... .
    • @Kartoch 希望你仍然得到这个:我尝试了你的解决方案但没有运气,在 hibernate 4 中仍然有效吗?
    【解决方案2】:

    已弃用 Session.connection() 方法的话题在讨论here

    【讨论】:

    • 很抱歉……这与问题有什么关系?
    • 当尝试检索 JDBC 连接以执行您的 sql 脚本时,您首先会注意到该方法已被弃用,但没有其他推荐的检索方法。
    【解决方案3】:

    您可以通过休眠会话实例获取底层 JDBC 连接:

    https://www.hibernate.org/hib_docs/v3/api/org/hibernate/Session.html#connection()

    所以你可以编写你的 executeScript() 方法来获取文件名和休眠会话并读取文件并在 jdbc 连接上执行 sql。

    HTH

    【讨论】:

      【解决方案4】:

      您听说过 Hypersonic SQL 吗?这是一个内存数据库,您的所有表都驻留在内存中,然后进行测试(使用读取、更新、插入、删除),最后当您关闭时,所有数据都消失了。阅读更多:http://www.hsqldb.org/

      【讨论】:

        猜你喜欢
        • 2014-09-07
        • 2015-01-08
        • 1970-01-01
        • 1970-01-01
        • 2018-12-06
        • 2017-11-01
        • 1970-01-01
        • 1970-01-01
        • 2019-02-23
        相关资源
        最近更新 更多