Hibernate关闭时运行脚本

时间:2014-06-19 06:20:32

标签: java spring hibernate junit

我正在使用Hibernate来管理测试套件,我需要在关机时运行自定义脚本。我找到了这个属性:

hibernate.hbm2ddl.import_files 

在启动时运行脚本,但我找不到关闭类似属性的文档。

更具体地说,我的导入脚本是创建自定义表(由于我无法更改的原因而无法通过注释创建),并且我需要在测试运行后删除这些自定义表。我正在使用

hibernate.hbm2ddl.auto=create-drop

正在销毁测试创建的其他表,但不会销毁导入脚本中创建的表。

正在使用的其他技术是Spring,JUnit,Postgres和Maven,以防任何人遇到涉及我可以用来实现相同目标的黑客攻击。

编辑:为了澄清,我正在寻找一种方法让Hibernate在测试套件运行完毕后运行一个脚本来删除一些表。

1 个答案:

答案 0 :(得分:1)

无法通过hbm2ddl进行操作。但是,您可以将DataSource连接到测试套件中,然后直接通过数据源删除表。如果您走这条路线,您可能会发现它也更干净,也可以使用相同的方法来创建,而不是使用hibernate.hbm2ddl.import_files。像这样:

@ContextConfiguration(locations = {"spring-dao-test.xml"})
@DirtiesContext(classMode = DirtiesContext.ClassMode.AFTER_EACH_TEST_METHOD)
public class ExampleDaoTest extends extends AbstractTestNGSpringContextTests {

    private static final Logger log = Logger.getLogger(ExampleDaoTest.class);

    @Resource
    private DataSource dataSource;

    @BeforeMethod
    private void createExtraTables() {
        try {
            log.info("Creating table extra_table");
            dataSource.getConnection().createStatement().execute("CREATE TABLE extra_table ( id number(4) not null )");
        } catch(SQLException se) {
            log.error("Unable to create table extra_table", se);
        }
    }

    @AfterMethod
    private void dropExtraTables() {
        try {
            log.info("Dropping table extra_table");
            dataSource.getConnection().createStatement().execute("DROP TABLE extra_table");
        } catch(SQLException se) {
            log.error("Unable to drop table extra_table", se);
        }
    }

    @Test
    public void testSomeStuff() {

    }
}