如何使用休眠执行 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 文件?的主要内容,如果未能解决你的问题,请参考以下文章