gpt4 book ai didi

sql-server - 如何在 H2 中初始化 View

转载 作者:行者123 更新时间:2023-12-04 03:20:43 26 4
gpt4 key购买 nike

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

H2 数据库的配置如下 -

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

我尝试将 View 定义放在 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()

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

如何配置 H2 以便它选择我的 View 定义?

最佳答案

我猜您正在向您的集成或生产环境声明另一个数据源,该环境连接到一个已经创建并声明了预期 View 的数据库。
运行测试并声明您的 @Bean 时您可能应该在应用程序启动之前指明要执行的 sql 是什么。 Spring Boot 创建一个空的 H2 db。
尝试这个:
假设您的 schema.sqlsrc/test/resources

@Bean
public DataSource dataSource() {
return new EmbeddedDatabaseBuilder().setType(EmbeddedDatabaseType.H2)
.addScript("schema.sql")
.build();
}
请注意您的 View 正在引用表 mmu也应该在同一个脚本或您想要的另一个脚本中声明(您可以根据需要/需要连接尽可能多的 addScript 调用)。
也许您通过使用 Repository 创建新对象来创建实体的方法这也是正确的,但我从未尝试过,而且我建议你的方式肯定有效。
无论如何,您还可以在使用 h2-console 运行测试时检查嵌入 H2 数据库的内容是什么。 .
来自 29.4 的 Spring 文档( 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 的开发人员工具,您也可以这样做:
添加 spring.h2.console.enabled = trueapplication.properties文件
然后您应该可以在默认路径 http://domain:port/contextPath/h2-console 中使用 H2 Web 控制台并随时查看内容。
希望有帮助:)

关于sql-server - 如何在 H2 中初始化 View ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38483213/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com