我有一个映射到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()
它会返回一个空列表,即使我在此测试中使用相关存储库创建了所有m
,mu
和u
个实体。
如何配置H2以便它获取我的视图定义?
答案 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();
}
请注意您的视图引用了表m
和mu
,这些表也应该在同一个脚本或您想要的其他脚本中声明(您可以根据需要连接多个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网络控制台,并检查每个时刻的内容。
希望有所帮助:)