我(一段时间没有接触 JPA)开始了一个使用 Hibernate 4.1、JPA2 和 Spring 的项目。它是一个具有共同生命周期的maven项目。
运行 mvn test 后,我得到了未找到所需数据库对象的预期结果(连接按预期成功)。然而,我所有的研究和实验都证明不足以做出一些看似常见的情况。
我希望能够在执行单元测试时让 Maven 在本地开发数据库中删除/创建模式;我想象 hibernate3-maven-plugin (理想情况下是 3.0 版)应该处理这个问题,但我没能让它工作。我不希望自动插入数据(为此,我可以使用 DBUnit,甚至更好地让每个测试生成自己的测试数据,但这在这里不起作用),但我确实希望在测试数据库上刷新架构,反射(reflect)我带注释的模型类的当前状态。我想这将绑定(bind)到流程测试资源阶段。
我希望使用(当前)架构定义生成一个(或一组)sql 文件,但我得到的最佳结果反射(reflect)了此处描述的问题:Maven + Spring + Hibernate: hibernate3-maven-plugin hbm2ddl fails for reason "Caused by: java.lang.NullPointerException" (目前还没有解决方案)。
我错过了一些愚蠢的事情还是现在真的不可能? 如果有人能为我提供以下任何内容,我将非常高兴
关于如何实现这一目标的适当文档
使用 hibernate 4 的工作示例
通过其他策略实现我的目标的实用方法的任何指南。
如果有任何相关性,数据库是 Postgres 9.1。
提前致谢。
最佳答案
一种方法是使用 Arquillian 。您可以为每个测试或一组测试创建单独的部署包,并使用它自己的 persistence.xml
和数据源。使用 persistence.xml
中的 hbm2dll
设置来创建/删除或更新架构:
<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 应用程序,所以请告知它是否有任何帮助。
关于java - 在 Maven 测试上生成数据库架构(Hibernate),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14886025/