如何在H2

时间:2016-07-20 13:51:12

标签: sql-server spring-boot spring-data-jpa h2 spring-test

我有一个映射到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 个答案:

答案 0 :(得分:2)

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

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

试试这个:

假设您的schema.sql位于src/test/resources

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

请注意您的视图引用了表mmu,这些表也应该在同一个脚本或您想要的其他脚本中声明(您可以根据需要连接多个addScript调用)。

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

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

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

  

以下情况属实:

     
      
  • 您正在开发一个Web应用程序
  •   
  • com.h2database:h2在classpath
  • 上   
  • 您正在使用Spring Boot的开发人员工具
  •   

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

spring.h2.console.enabled = true档案

中添加application.properties

然后,您应该可以在默认路径http://domain:port/contextPath/h2-console中使用H2网络控制台,并检查每个时刻的内容。

希望有所帮助:)