Sql server 如何在H2中初始化视图
我有一个映射到SQL视图的实体。我还为它配置了一个SpringDataJPA存储库。当应用程序运行时,一切正常。但是,当我尝试运行使用内存中H2数据库的测试时,问题就出现了。我怀疑这是因为H2启动时视图不存在,并且它可能被视为一个独立的实体,因此springboot将其配置为一个独立的内存表 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
@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();
}