Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jsf-2/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 如何在H2中初始化视图_Sql Server_Spring Boot_Spring Data Jpa_H2_Spring Test - Fatal编程技术网

Sql server 如何在H2中初始化视图

Sql server 如何在H2中初始化视图,sql-server,spring-boot,spring-data-jpa,h2,spring-test,Sql Server,Spring Boot,Spring Data Jpa,H2,Spring Test,我有一个映射到SQL视图的实体。我还为它配置了一个SpringDataJPA存储库。当应用程序运行时,一切正常。但是,当我尝试运行使用内存中H2数据库的测试时,问题就出现了。我怀疑这是因为H2启动时视图不存在,并且它可能被视为一个独立的实体,因此springboot将其配置为一个独立的内存表 H2数据库的配置如下所示- @Bean public DataSource dataSource() { return new EmbeddedDatabaseBuilder().setType(E

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

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> {}
它返回一个空列表,即使在此搜索之前,我在测试中使用相关存储库创建了所有
m
mu
u
实体


如何配置H2以使其获取我的视图定义?

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

当运行测试并声明
@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();
}
请注意,您的视图引用的表
m
mu
,这些表也应该在同一个脚本或您想要的其他脚本中声明(您可以根据需要连接任意多个addScript调用)

也许您通过使用
存储库创建新对象来创建实体的方法也是正确的,但我从未尝试过,我建议您采用的方法确实有效

无论如何,您也可以在使用
H2控制台运行测试时检查嵌入H2数据库的内容

从29.4()的Spring文档中:

以下应该是正确的:

  • 您正在开发一个web应用程序
  • h2数据库:h2在类路径上
  • 您正在使用SpringBoot的开发工具
如果您不使用Spring Boot的开发工具,也可以这样做:

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

然后您应该能够在默认路径中使用H2 web控制台
http://domain:port/contextPath/h2-控制台
并随时检查内容


希望有帮助:)

嗯,我想要一个更干净的解决方案。如果我能强迫H2识别我的视图映射,那就太好了,但是将实体映射到视图似乎不起作用:(……哦,我想这个视图的好处大于这个简单的缺点。谢谢你的回答!
@Bean
public DataSource dataSource() {
    return new EmbeddedDatabaseBuilder().setType(EmbeddedDatabaseType.H2)
                                        .addScript("schema.sql")                                        
                                        .build();
}