java - 在 Maven 测试上生成数据库架构(Hibernate)

标签 java hibernate maven hbm2ddl

我(一段时间没有接触 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/

相关文章:

java - 未找到 DataSource.groovy。 chalice 2.4.4

maven - Maven Antrun:将Maven属性传递给ant

java - GWT - 防止 PDF 文件在 IE 中缓存?

java - 如何用Java进行二进制算术运算?

java - 连接多个辅助表

java - 在spring mvc中从MySQL数据库读取BLOB图像

java - 在 Eclipse 中配置 JDK——可以在 Maven 中完成吗?

maven - Maven 需要 JDK

java - Java 运行时库 (rt.jar) 中的断点

java - LocalSessionFactoryBean 无法作为 SessionFactory 注入(inject)