如何在 H2 中初始化视图

Posted

技术标签:

【中文标题】如何在 H2 中初始化视图【英文标题】:How do I initialize a view in H2 【发布时间】:2016-11-23 19:19:54 【问题描述】:

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

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()

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

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

【问题讨论】:

【参考方案1】:

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

在运行测试并声明您的@Bean 时,您可能应该指出您希望在应用程序启动之前执行的 sql 是什么。 Spring Boot 创建一个空的 H2 db。

试试这个:

假设您的schema.sqlsrc/test/resources

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

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

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

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

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

以下应该是正确的:

您正在开发一个 Web 应用程序 com.h2database:h2 在类路径中 您正在使用 Spring Boot 的开发人员工具

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

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

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

希望有帮助:)

【讨论】:

嗯,我想要一个比这更干净的解决方案。如果我能以某种方式强制 H2 识别我的视图映射,那就太好了,但似乎将实体映射到视图不起作用:( .... 哦,好吧,我猜这个视图的好处超过了这个简单的缺点。谢谢你的回答!

以上是关于如何在 H2 中初始化视图的主要内容,如果未能解决你的问题,请参考以下文章

在 Spring Boot 应用程序上使用 Flyway 时如何在 H2 中加载初始数据?

在 H2 中初始化数据时从文件中加载数据

java - 如何在java桌面应用程序中使用spring(事务)和hibernate创建嵌入式H2 DB?

如何访问gerrit的h2数据库

如何避免“无法确定数据库名称 [H2] 的 Hibernate 方言!”?

使用 Liquibase 为 Spring Boot 应用程序中的单元测试初始化​​内存 H2