在maven测试中生成数据库模式(Hibernate)

时间:2013-02-14 23:36:27

标签: java hibernate maven hbm2ddl

我(一段时间没有触及JPA)启动了一个带有Hibernate 4.1,JPA2和Spring的项目。这是一个具有共同生命周期的maven项目。

运行mvn测试后,我得到了未找到所需数据库对象的预期结果(连接按预期成功)。然而,我的所有研究和实验都证明不足以制造一些看似常见的事情。

  • 我希望能够在执行单元测试时让maven删除/创建本地开发数据库的模式;我想像hibernate3-maven-plugin(理想版本3.0)应该处理这个但我没有设法让它工作。我不期望任何自动插入数据(为此我可以使用DBUnit甚至更好地让每个测试生成自己的测试数据,但这在这里没有任何作用)但我确实希望在测试数据库上刷新模式,反映我注释的模型类的当前状态。我想这将与process-test-resources阶段绑定。

  • 我希望用(当前)模式定义生成一个(或一组)sql文件,但我得到的最好结果反映了这里描述的问题:Maven + Spring + Hibernate: hibernate3-maven-plugin hbm2ddl fails for reason "Caused by: java.lang.NullPointerException"(目前还没有解决方案)。

我是否遗漏了一些愚蠢的东西或者此时真的不可能? 如果有人能为我提供任何

,我会很高兴
  • 如何实现这一目标的正确文件

  • 使用hibernate 4的工作示例

  • 使用其他策略实现目标的任何实用方法指南。

如果它有任何相关性,数据库是Postgres 9.1。

提前致谢。

2 个答案:

答案 0 :(得分:2)

这样做的一种方法是使用Arquillian。您可以为每个测试或一组测试创建单独的部署包,使用它自己的persistence.xml和数据源。使用hbm2dll中的persistence.xml设置创建 - 删除或更新架构:

<property name="hibernate.hbm2ddl.auto" value="create-drop" />

如果要预填充数据库,可以在部署中添加import.sql,这将在应用程序启动时由hibernate执行,或者使用Arquillian Persistence extension

这是一个完整的arquillian测试设置示例:

@RunWith(Arquillian.class)
public class MyTest {

    @Deployment
    public static Archive<?> createTestArchive() {

        return ShrinkWrap.create(WebArchive.class, "myTest.war")
                .addPackages(true, "com.example")
                .addAsResource("testSeeds/seed.sql", "import.sql")
                .addAsResource("in-mem-persistence.xml", "META-INF/persistence.xml")
                .addAsWebInfResource("in-mem-datasource.xml");
    }

一个缺点是容器内测试比简单的单元测试慢。

我不确定Arquillian能够很好地使用Spring,我只将它用于Java EE应用程序,所以请告诉它是否有任何帮助。

答案 1 :(得分:0)

再次回答我自己的问题。

为了达到我想要的结果,我必须在maven上连接hibernate3-maven-plugin的hbm2ddl在进程类阶段的执行,并在process-test-resources阶段再次执行sql-maven-plugin。第一个为Hibernate的模型生成sql,第二个将它应用于数据库。

事后看来,实际上似乎是一个体面而干净的解决方案。

我仍然有兴趣了解最佳实践,如果它们与我的解决方案不同,那么实现设置数据库以便使用来自Hibernate模型的maven进行测试的目标。