我的数据层中有几个实体存储在特定模式中。例如:
@Entity
@Table(name = "FOO", schema = "DUMMY")
public class Foo {}
我正在尝试设置H2嵌入式数据库,以便对我的数据层进行集成测试。
我在测试中使用@DataJpaTest
注释来自动配置H2嵌入式数据库。但是,表的创建失败,因为在初始化时未创建模式DUMMY
。
在测试用例中创建表之前如何创建模式的任何想法?
我试图使用@Sql(陈述="创建模式,如果不是DUMMY")但是没有成功。
另外,我已尝试在spring.datasource.url = jdbc:h2:mem:test;INIT=CREATE SCHEMA IF NOT EXISTS DUMMY
文件中设置test.properties
和TestPropertySource("classpath:test.properties")
,但这也不起作用。
答案 0 :(得分:15)
我有同样的问题,我设法通过创建带有内容的schema.sql(在资源文件夹中)解决
CREATE SCHEMA IF NOT EXISTS <yourschema>
可以找到文档here,但是由于缺乏真实的例子,因此非常复杂。 警告:此脚本也在正常(非测试)环境中执行。
不是强制性的,但是好的做法是,仅在测试范围中添加h2依赖性
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<scope>test</scope>
</dependency>
答案 1 :(得分:2)
经过几个小时的挣扎,我找到了解决方法。
您可以在spring.jpa.properties.hibernate.default_schema = DUMMY
中定义application.properties
。
然后在spring.jpa.properties.hibernate.default_schema =
中设置test.properties
并与@TestPropertySource("classpath:test.properties")
一起使用
因此,通过这种方式,不会创建架构DUMMY,并且将在默认架构中创建实体。
答案 2 :(得分:0)
就我而言,schema.sql
下的 test/resources
不起作用。
test/resources/application.yml
文件中的以下配置有效。
spring:
datasource:
username: sa
password: sa
driver-class-name: org.h2.Driver
url: jdbc:h2:mem:usrmgmt;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE;MODE=MYSQL;INIT=CREATE SCHEMA IF NOT EXISTS DUMMY;
liquibase:
change-log: classpath:db/changelog/db.changelog-master.xml
在上面的配置中,提供下面的附加配置
INIT=CREATE SCHEMA IF NOT EXISTS DUMMY
对现有数据库 url 的扩展。如果没有这个,则面临异常 Caused by: org.h2.jdbc.JdbcSQLSyntaxErrorException: Schema "DUMMY" not found;
。spring.liquibase.change-log
属性。如果没有这个,则面临异常 Caused by: liquibase.exception.ChangeLogParseException: classpath:/db/changelog/db.changelog-master.yaml does not exist
。