Hibernate:如何手动创建 - 删除模式?

时间:2015-10-24 18:58:54

标签: java spring hibernate postgresql

我想在每次junit测试后创建drop表(我的db是postgresql)。我试过没有运气的春天的@Transactional(我猜我在代码中使用了一些交易和东西之间的交易)所以我很想采取一些hacky方式。这是我在@Before中使用的代码,并期望hibernate在每次测试时创建 - 删除

    Configuration configuration = new Configuration();
    configuration.configure("/hibernate.cfg.xml");
    StandardServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder().applySettings(configuration.getProperties()).build();

    MetadataSources metadataSources = new MetadataSources(serviceRegistry);
    MetadataBuilder metadataBuilder = metadataSources.getMetadataBuilder();

    SchemaExport export = new SchemaExport((MetadataImplementor) metadataBuilder.build());
    export.setFormat(true);
    export.create(true,true);

操作响应成功但没有真正发生。 任何帮助将不胜感激。

请注意,我已将hbm2dll设置为create(我也尝试使用create-drop:

<property name="hbm2ddl.auto">create</property>

1 个答案:

答案 0 :(得分:1)

如果您使用SpringContext运行测试,那么对我有用的解决方案是:DirtiesContext。使用此注释,您明确指出您的测试已在您的上下文(包括数据库)中进行了一些可能影响其他测试的更改。所以Spring将抛弃这种背景,为下一次测试创造一个全新的。此解决方案与Hibernate中的create-drop配置相结合,将导致每次需要时都重新创建数据库。

注意: 重建DB(或上下文)非常耗时。如果可以的话,你应该尽量避免在你的测试中使用它。清除数据库然后重新创建数百次会增加运行所有测试所需的时间。