MD *_*med 6 sql-server h2 spring-test spring-data-jpa spring-boot
我有一个映射到 SQL 视图的实体。我还为其配置了一个 spring data jpa 存储库。当应用程序运行时,一切正常。然而,当我尝试运行使用内存 H2 数据库的测试时,问题就出现了。我怀疑这样做的原因是H2启动时视图不存在,并且它可能被视为一个独立的实体,因此spring boot将其配置为独立的内存表。
H2 数据库的配置如下 -
@Bean
public DataSource dataSource() {
return new EmbeddedDatabaseBuilder().setType(EmbeddedDatabaseType.H2).build();
}
Run Code Online (Sandbox Code Playgroud)
我尝试将视图定义放入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
Run Code Online (Sandbox Code Playgroud)
然而,这也无济于事。因此,每当我在测试中调用配置的 JPA 存储库时 -
public interface MyViewRepository extends JpaRepository<MyView, Long> {}
Run Code Online (Sandbox Code Playgroud)
像这样 -
myViewRepository.findAll()
Run Code Online (Sandbox Code Playgroud)
它返回一个空列表,即使我在搜索之前使用相关存储库在测试中创建了所有m
、mu
和实体。u
如何配置 H2 以便它获取我的视图定义?
我猜您正在向集成或生产环境声明另一个数据源,该数据源连接到已创建并声明了预期视图的数据库。
\n当运行测试并声明你的时,@Bean
你可能应该指出你想要在应用程序启动之前执行的 sql 是什么。Spring Boot 创建一个空的 H2 数据库。
尝试这个:
\n假设你的schema.sql
在src/test/resources
@Bean\npublic DataSource dataSource() {\n return new EmbeddedDatabaseBuilder().setType(EmbeddedDatabaseType.H2)\n .addScript("schema.sql") \n .build();\n}\n
Run Code Online (Sandbox Code Playgroud)\n请注意,您的视图正在引用表m
,并且mu
也应该在同一脚本或您想要的另一个脚本中声明(您可以根据需要连接任意数量的 addScript 调用)。
也许您通过创建新对象来创建实体的方法Repository
也是正确的,但我从未尝试过,而且我建议您的方法肯定有效。
无论如何,您还可以在使用 .h2 运行测试时检查嵌入 H2 数据库的内容h2-console
。
来自 Spring 文档 29.4 ( http://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-sql.html ):
\n\n\n以下内容应该是正确的:
\n\n
\n- 您正在开发一个网络应用程序
\n- com.h2database:h2 位于类路径上
\n- 您正在使用 Spring Boot\xe2\x80\x99s 开发者工具
\n
如果您没有使用 Spring Boot 的开发人员工具,您也可以这样做:
\nspring.h2.console.enabled = true
在 application.properties
文件中添加
然后你应该能够在默认路径下使用H2 Web控制台 http://domain:port/contextPath/h2-console
并检查每时每刻的内容。
希望有帮助:)
\n 归档时间: |
|
查看次数: |
3451 次 |
最近记录: |