2013-02-14 47 views
1

我(在不触及JPA的一段时间后)启动了一个使用Hibernate 4.1,JPA2和Spring的项目。这是一个具有共同生命周期的maven项目。在maven测试中生成数据库模式(Hibernate)

运行mvn测试时,我得到预期的结果找不到所需的数据库对象(连接如预期的那样成功)。然而,我的所有研究和实验都不足以制造出似乎是常见的情况。

  • 我希望在执行单元测试时能够将maven删除/创建模式作为本地开发数据库;我想到hibernate3-maven-plugin(理想版本3.0)应该可以处理这个,但是我没有设法让它工作。我不希望任何数据的自动插入(为此我可以使用DBUnit,或者甚至更好地让每个测试都生成它自己的测试数据,但这在这里没有任何作用),但我确实希望在测试数据库上刷新模式,反映了我注释的模型类的当前状态。我想这会被绑定到流程测试资源阶段。我想用(当前)模式定义生成一个(或一组)sql文件,但是我得到的最好结果反映了这里描述的问题:Maven + Spring + Hibernate: hibernate3-maven-plugin hbm2ddl fails for reason "Caused by: java.lang.NullPointerException"(到目前为止还没有解决方案)。

我是否错过了一些愚蠢的东西或者它现在真的不可能? 我会很高兴,如果有人能提供给我任何

  • 的适当的文件,这是应该如何来实现

  • 使用Hibernate 4个

  • 实用的任何准则的工作示例用其他策略实现我的目标的方法。

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

在此先感谢。

回答

0

再回答我自己的问题。

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

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

我仍然有兴趣知道的最佳实践,如果他们从我的解决方案不同,以实现与Maven测试从休眠模式建立数据库的目的。

2

这样做的一种方法是使用Arquillian。您可以为每个测试或一组测试创建一个单独的部署包,并使用它自己的persistence.xml和数据源。使用hbm2dll设置在persistence.xml要么创建拖放或更新模式:

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

如果你想预填充数据库,您可将import.sql添加到您的部署,这将通过休眠应用启动时执行,或使用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应用程序,所以请告诉我们它是否有帮助。