如何在 H2 中初始化视图

MD *_*med 6 sql-server h2 spring-test spring-data-jpa spring-boot

我有一个映射到 SQL 视图的实体。我还为其配置了一个 spring data jpa 存储库。当应用程序运行时,一切正常。然而,当我尝试运行使用内存 H2 数据库的测试时,问题就出现了。我怀疑这样做的原因是H2启动时视图不存在,并且它可能被视为一个独立的实体,因此spring boot将其配置为独立的内存表。

H2 数据库的配置如下 -

@Bean
public DataSource dataSource() {
    return new EmbeddedDatabaseBuilder().setType(EmbeddedDatabaseType.H2).build();
}
Run Code Online (Sandbox Code Playgroud)

我尝试将视图定义放入schema.sql测试资源文件夹中的文件中 -

CREATE VIEW
    my_view
AS
    SELECT
         column_1,
         column_2
    FROM
        m
    INNER JOIN
        mu
    ON
        m.id = mu.m_id
    INNER JOIN
        u
    ON
        mu.id = u.mu_id
Run Code Online (Sandbox Code Playgroud)

然而,这也无济于事。因此,每当我在测试中调用配置的 JPA 存储库时 -

public interface MyViewRepository extends JpaRepository<MyView, Long> {}
Run Code Online (Sandbox Code Playgroud)

像这样 -

myViewRepository.findAll()
Run Code Online (Sandbox Code Playgroud)

它返回一个空列表,即使我在搜索之前使用相关存储库在测试中创建了所有mmu和实体。u

如何配置 H2 以便它获取我的视图定义?

exo*_*dus 2

我猜您正在向集成或生产环境声明另一个数据源,该数据源连接到已创建并声明了预期视图的数据库。

\n

当运行测试并声明你的时,@Bean你可能应该指出你想要在应用程序启动之前执行的 sql 是什么。Spring Boot 创建一个空的 H2 数据库。

\n

尝试这个:

\n

假设你的schema.sqlsrc/test/resources

\n
@Bean\npublic DataSource dataSource() {\n    return new EmbeddedDatabaseBuilder().setType(EmbeddedDatabaseType.H2)\n                                        .addScript("schema.sql")                                        \n                                        .build();\n}\n
Run Code Online (Sandbox Code Playgroud)\n

请注意,您的视图正在引用表m,并且mu也应该在同一脚本或您想要的另一个脚本中声明(您可以根据需要连接任意数量的 addScript 调用)。

\n

也许您通过创建新对象来创建实体的方法Repository也是正确的,但我从未尝试过,而且我建议您的方法肯定有效。

\n

无论如何,您还可以在使用 .h2 运行测试时检查嵌入 H2 数据库的内容h2-console

\n

来自 Spring 文档 29.4 ( http://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-sql.html ):

\n
\n

以下内容应该是正确的:

\n
    \n
  • 您正在开发一个网络应用程序
  • \n
  • com.h2database:h2 位于类路径上
  • \n
  • 您正在使用 Spring Boot\xe2\x80\x99s 开发者工具
  • \n
\n
\n

如果您没有使用 Spring Boot 的开发人员工具,您也可以这样做:

\n

spring.h2.console.enabled = trueapplication.properties文件中添加

\n

然后你应该能够在默认路径下使用H2 Web控制台 http://domain:port/contextPath/h2-console并检查每时每刻的内容。

\n

希望有帮助:)

\n