如何在 H2 中初始化视图

How do I initialize a view in H2

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

H2数据库的配置如下-

@Bean
public DataSource dataSource() {
    return new EmbeddedDatabaseBuilder().setType(EmbeddedDatabaseType.H2).build();
}

我尝试将视图定义放在测试资源文件夹中的 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

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

public interface MyViewRepository extends JpaRepository<MyView, Long> {}

像这样-

myViewRepository.findAll()

它 returns 是一个空列表,即使我在搜索之前使用它们的相关存储库在我的测试中创建了所有 mmuu 实体。

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

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

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

试试这个:

假设您的 schema.sqlsrc/test/resources

@Bean
public DataSource dataSource() {
    return new EmbeddedDatabaseBuilder().setType(EmbeddedDatabaseType.H2)
                                        .addScript("schema.sql")                                        
                                        .build();
}

请注意您的视图引用的表 mmu 也应在同一脚本或您想要的其他脚本中声明(您可以连接任意数量的 addScript 调用 want/need).

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

总之,在运行用h2-console.

测试的时候,你也可以查看embed H2数据库的内容是什么

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

The following should be true:

  • You are developing a web application
  • com.h2database:h2 is on the classpath
  • You are using Spring Boot’s developer tools

如果您不使用 Spring Boot 的开发者工具,您也可以这样做:

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

那你应该可以在默认路径http://domain:port/contextPath/h2-console下使用H2 web控制台,随时查看内容是什么

希望对您有所帮助:)