我(一会儿不接触JPA后)启动了一个项目使用Hibernate 4.1,JPA2和Spring。 它是一个共同的生命周期Maven项目。
一旦运行MVN测试我得到没有找到所需的数据库对象(连接成功后如预期)的预期效果。 我所有的研究和实验,然而,事实证明还不足以使一些似乎是一个常见的情况。
我希望能有行家滴/在执行单元测试,创建该模式的地方发展数据库; 我想到的是Hibernate3中,Maven的插件(3.0版最好)应对此进行处理,但我没能有工作。 我不希望任何数据自动插入(为了这个,我可以使用DBUnit的甚至更好的让每个测试生成自己的测试数据,但这在这里扮演任何作用),但我确实希望该架构可以在测试数据库上刷新,反映我的注释模型类的当前状态。 我想这会被绑定到过程检验资源的阶段。
我希望能产生一个(或一组)与(电流)模式定义的SQL文件,但我得到了最好的结果反映了所描述的问题在这里: Maven的+ Spring + Hibernate的:理性“所致Hibernate3中,Maven的插件就是hbm2ddl失败:显示java.lang.NullPointerException” (无解到目前为止)。
我失去了一些愚蠢的或者是不是真的不会在这个时候不可能性? 我会很高兴,如果有人能提供给我任何的
这是如何适当的文件应该可以实现
使用休眠4的工作例子
的实用方法的任何准则实现我的一些其他战略目标。
如果它的任何相关性,数据库是Postgres的9.1。
提前致谢。
这样做的一个方法是使用的Arquillian 。 您可以为每个测试或一系列测试创建一个单独的部署包,与它自己persistence.xml
和数据源。 使用hbm2dll
设置在persistence.xml
任意创造降或更新模式:
<property name="hibernate.hbm2ddl.auto" value="create-drop" />
如果你想预填充数据库,您可将添加import.sql
到部署将由休眠应用程序启动执行,或者使用的Arquillian扩展持久性 。
下面是一个完整的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应用程序,所以请告诉我们,如果它的任何帮助。
再回答我自己的问题。
要达到的效果,我想我不得不链与流程测试资源相SQL-Maven的插件的另一执行Maven的Hibernate3中,Maven的插件的就是hbm2ddl的工艺类阶段执行。 首先生成SQL对Hibernate的模型和第二它适用于数据库中。
事后看来,实际上似乎体面和干净的解决方案。
我仍然有兴趣知道的最佳实践,如果他们从我的解决方案不同,以实现从一个Hibernate模型与Maven测试设置数据库的目标。