Java 使用JPA初始插入播放框架

Java 使用JPA初始插入播放框架,java,hibernate,jpa,playframework,Java,Hibernate,Jpa,Playframework,我在Hibernate中使用Play2.3。 在第一次启动应用程序时,我希望将一些数据作为默认值插入数据库 在我的例子中,我有一个实体类Studycourse。所有表都是在第一次运行时通过JPA创建的 我使用DB evolution 1.sql插入默认数据,例如: INSERT INTO studycourse (id, title) VALUES (1, 'Computer Science'); 这在使用普通激活器运行命令时有效。但是,如果我执行activator测试并使用inMemoryD

我在Hibernate中使用Play2.3。 在第一次启动应用程序时,我希望将一些数据作为默认值插入数据库

在我的例子中,我有一个实体类Studycourse。所有表都是在第一次运行时通过JPA创建的

我使用DB evolution 1.sql插入默认数据,例如:

INSERT INTO studycourse (id, title) VALUES (1, 'Computer Science');
这在使用普通激活器运行命令时有效。但是,如果我执行activator测试并使用inMemoryDatabase启动一个简单的集成测试,我会得到以下错误:

[error] play - Table "STUDYCOURSE" not found; SQL statement: INSERT INTO studycourse (id, title) VALUES (1, 'Computer Science')
我猜,最初的JPA设置不是在内存数据库中完成的

问题:关于如何做到这一点,是否有最佳实践

集成测试如下所示:

public class IntegrationTest {
    @Test
    public void test() {
        running(testServer(3333, fakeApplication(inMemoryDatabase())), HTMLUNIT, new Callback<TestBrowser>() {
            public void invoke(TestBrowser browser) {
                browser.goTo("http://localhost:3333");
                assertThat(browser.pageSource()).contains("Your new application is ready.");
            }
        });
    }
}

提前感谢。

您最初的问题本质上是问我如何在测试环境中执行JPA初始化步骤,以便在运行涉及数据库的集成测试时填充内存中的数据库

我的回答不会直接解决这个问题,但会总结出我们如何解决你们试图解决的相同的根本问题

我对您目标的理解是,您希望:

建立数据库模式迁移的良好实践 建立数据库集成测试的通用实践 数据库模式迁移

正如我在上面的评论中提到的,我们用于数据库模式迁移,它是一个出色的工具。Flyway有一个SBT插件,因此您可以直接从activator运行flywayClean和flywayMigrate,立即删除并重新初始化数据库

Flyway支持复杂的文件名版本,因此您可以执行SQL脚本,如v1.1.0.SQL、v1.1.1.SQL和v1.2.0.SQL。如果您试图执行迁移脚本,而这些脚本并不是对数据库现有状态的纯粹改进,Flyway也会抱怨。这意味着我们正在使用flyway将数据库模式迁移推送到生产环境中,如果我们做了一些愚蠢的事情,这将失败。当然,为了安全起见,我们总是在迁移之前进行DB备份

最后,Flyway甚至可以让您执行java程序来填充数据库,以防您想使用服务方法而不仅仅是原始SQL

不管怎样,你在这里的选择基本上是玩进化,飞行路线,或液化

内存数据库与开发数据库

在这个问题上,我看到了两个主要立场:

永远不要在内存数据库上测试,因为这样您的测试就不会 揭示内存中数据库和 您的生产数据库,或

使用内存中的数据库进行本地测试,但至少要有 使用dev数据库构建服务器

例如,您可以在结尾处看到注释

选项1总体上为您提供了更高的速度,但是延迟了从编写错误代码到获得失败的集成测试之间的反馈时间

选项2总体速度稍低,但可以立即对实际数据库进行反馈

与工程中的大多数事情一样,没有最好的解决方案,只有一组对您的团队最有意义的权衡

选择ORM层

我们最初是从Hibernate开始的,但最终切换到Hibernate。有关jOOQ的正面概述,以及对两者的良好讨论,请参阅

Hibernate似乎对我们很有吸引力,因为它是如此成熟和流行,但当我们开始遇到经典的SQL与面向对象的阻抗不匹配时,例如如何处理继承,Hibernate需要学习曲线和一些设置开销

我们的理由是,如果我们要产生这样的开销,为什么不直接使用SQL进行映射呢?因此,我们转向了JOOQ,并且能够编写一些非常干净、优雅、可测试的代码。如果您在hibernate路径上走得不太远,我建议您看看jOOQ

如果你已经进入了冬眠状态,并且它对你来说运行良好,那么切换可能没有什么价值

数据库集成测试的最佳实践

我想知道这个确切的问题,并将其发布在。《约克》的作者卢卡斯对此作了一些一般性的评论

此时,我们将对DAO和服务类进行集成测试。我们的测试在flywayClean和flywayMigrate运行后运行。然后,编写每个测试是为了在测试结束后进行清理。最大的问题是性能,到目前为止这还不是问题,但以后可能会成为问题

我也在上面发了帖子,得到了一个有用的答案。看

免责声明:我们即将推出我们的应用程序,但尚未在生产环境中运行,因此其他人可能需要添加其他最佳实践。

我们使用的,我发现它比Play的原生版本更强大,我们假设在数据库迁移发生后运行测试。因此,在本地开发中,在完成数据库迁移之前,我不会运行测试,在我们的构建环境中,Jenkins先进行数据库迁移,然后进行te
谢谢乔希·帕德尼克的评论。我的团队正在寻找一种可靠的数据库迁移工具,我将关注flywaydb。同时,我明白了,是否可以将当前数据库克隆到mem中的测试中,或者只使用dev数据库而不是mem中的数据库。