如何使用休眠执行 sql-script 文件?

Posted

技术标签:

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

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

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

   ... testing logic ...

   clean_database();

hibernate 有办法做到这一点吗?

【问题讨论】:

【参考方案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/

【讨论】:

以上是关于如何使用休眠执行 sql-script 文件?的主要内容,如果未能解决你的问题,请参考以下文章

如何在休眠中使用 UNION 执行查询

deepin如何休眠

如何在休眠中执行 .filter()

为啥休眠不能执行命令

如何使用类属性映射休眠中的列?

Linux 休眠,挂起(待机),关机等几个命令的区别及如何实现;如何启用Ubuntu的休眠模式