我(一段时间没有触及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。
提前致谢。
答案 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进行测试的目标。