【问题标题】:Generate database schema (Hibernate) on maven test在 Maven 测试中生成数据库模式(Hibernate)
【发布时间】:2013-01-30 21:58:55
【问题描述】:

我(一段时间没有接触 JPA)开始了一个使用 Hibernate 4.1、JPA2 和 Spring 的项目。这是一个具有共同生命周期的 Maven 项目。

在运行 mvn test 时,我得到了未找到所需数据库对象的预期结果(连接按预期成功)。然而,我所有的研究和实验都证明还不足以做出看似普遍的情况。

  • 我希望能够在执行单元测试时让 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。

提前致谢。

【问题讨论】:

    标签: java hibernate maven hbm2ddl


    【解决方案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 应用程序,所以请告诉它是否有帮助。

    【讨论】:

      【解决方案2】:

      再次回答我自己的问题。

      为了达到我想要的结果,我必须在 maven 中将 hibernate3-maven-plugin 的 hbm2ddl 在 process-classes 阶段的执行与另一个 sql-maven-plugin 在 process-test-resources 阶段的执行联系起来。第一个为 Hibernate 的模型生成 sql,第二个将其应用于数据库。

      事后看来,这似乎是一个体面且干净的解决方案。

      我仍然有兴趣了解最佳实践(如果它们与我的解决方案不同),以实现设置数据库以使用 Hibernate 模型中的 maven 进行测试的目标。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-12-18
        • 1970-01-01
        • 1970-01-01
        • 2013-06-05
        • 2012-12-12
        • 2014-05-24
        相关资源
        最近更新 更多