Java Arquillian和Flyway在内存中使用不同版本的H2
我正在尝试创建一个JPA助手,它最终将变成一个jar并用于其他项目。我想将集成测试添加到此项目中,因此我添加了一个Java Arquillian和Flyway在内存中使用不同版本的H2,java,h2,flyway,jboss-arquillian,hibernate-entitymanager,Java,H2,Flyway,Jboss Arquillian,Hibernate Entitymanager,我正在尝试创建一个JPA助手,它最终将变成一个jar并用于其他项目。我想将集成测试添加到此项目中,因此我添加了一个TestEntity和TestService类(它们指的是DB模式中的一个简单的TEST表) 目标是使用创建内存中数据库,使用在容器中运行测试,以及使用创建/填充测试数据库。Flyway由@ApplicationScoped类的侦听器触发 但是,每当我触发集成测试时,测试似乎都能正常工作,直到调用count(*)查询为止。此时,Hibernate抱怨模式(刚刚在Flyway中创建)不
TestEntity
和TestService
类(它们指的是DB
模式中的一个简单的TEST
表)
目标是使用创建内存中数据库,使用在容器中运行测试,以及使用创建/填充测试数据库。Flyway由@ApplicationScoped
类的侦听器触发
但是,每当我触发集成测试时,测试似乎都能正常工作,直到调用count(*)
查询为止。此时,Hibernate抱怨模式(刚刚在Flyway中创建)不存在:schema'DB'不存在
有很多日志,但亮点如下所示:
- 已启动测试Glassfish服务器
- 冬眠开始
- 它还没有抱怨什么
- 如果
设置为hibernate.hbm2ddl.auto
,则它会抱怨在Flyway中创建的表不存在(validate
)Schema validation:缺少表[DB.TEST]
- Flyway执行数据迁移
- 它表示两个脚本都成功执行
- 测试代码开始运行
- 代码失败了
架构“DB”不存在
- 确保
和EntityManager
正在与同一数据库通信。Flyway
- 名称相同(请参见
、persistence.xml
和EntityManagerFactory
),我尝试添加/删除各种FlywayDataLoader
值,但没有任何效果模式
- 名称相同(请参见
- 强制Flyway代码在Hibernate代码之前执行
- 在测试开始之前,强制Hibernate刷新其架构
- 将语法错误放入Flyway迁移代码会导致测试因SQL错误而失败。
- 如果将重复语句放入SQL代码中(例如:再次创建表或模式),也会发生同样的情况
- 我尝试通过JDBC连接字符串中的启动脚本触发Flyway
- i、 e.:
jdbc:h2:mem:test;DB_CLOSE_DELAY=-1;INIT=RUNSCRIPT来自“classpath:create.sql”
- 我知道脚本被触发(因为添加错误会导致测试失败),但它仍然无法解决
模式“DB”不存在的问题
- i、 e.:
- 各种风格的
hibernate.hbm2ddl.auto
:none
架构“DB”不存在
:验证
架构验证:缺少表[DB.TEST]
,update
:已创建表格,但缺少来自Flyway的数据create drop
- 将Flyway代码放在EntityManagerFactory.create()中
- 将Flyway代码放入and中
- 更改Flyway/persistence.xml连接以使用数据库文件而不是内存(例如:
)。jdbc:h2:~/testdb
- 这将在
中创建一个名为C:\Users\
的文件。该文件显示了Flyway与其交互的证据,但EntityManager仍生成test db.mv
模式“DB”不存在的错误
- 我还将
设置为hibernate.hbm2ddl.auto
,然后在整个硬盘上搜索create
的第二个实例,但没有找到test db.mv
- 这将在
-
- 看起来很棒,但我在一个公司网络上,他们还没有批准
- 弹簧-*
- 这个项目没有使用Spring任何东西
/resources/db.migration/
文件夹中,分别命名为V1\uu CreateDatabase.sql
和V2\uu AddTestClasses.sql
创建模式数据库;
创建表DB.TEST
(
ID INT自动增量
约束PK_请求_审核
主键,
FN VARCHAR2(256个字符)默认为NULL不为NULL,
LN VARCHAR2(256个字符)默认为NULL不为NULL,
BD TIMESTAMP default SYSDATE not null
)
;
在DB.TEST(FN,LN,BD)中插入值('Alice','Zyl',PARSEDATETIME('1985-03-13','yyyy-MM-dd','en');
插入DB.TEST(FN,LN,BD)值('Bart','Young',PARSEDATETIME('1988-03-25','yyyy-MM-dd','en');
实体管理器
此处使用的unitName
与Persistence.xml
中使用的持久化单元名称匹配。此处使用的JDBC连接字符串与Flyway Java脚本中使用的字符串相同
公共类EntityManager工厂{
@PersistenceUnit(unitName=“TestDS”)
私有javax.persistence.EntityManagerFactory;
@产生
@违约
@请求范围
公共实体管理器创建(){
返回emFactory.createEntityManager();
}
public void dispose(@Disposes@Default EntityManager em){
如果(em.isOpen()){
em.close();
}
}
}
Persistence.xml
org.hibernate.jpa.HibernatePersistenceProvider
myproject.beans.TestObject
不起眼的刀类?
@RequestScoped
公共类测试服务{
@注入
私人实体管理者;
@注入
P
// various "server startup" logs
// ...
// misc hibernate logs
Apr 15, 2020 9:40:39 AM org.hibernate.jpa.internal.util.LogHelper logPersistenceUnitInformation
INFO: HHH000204: Processing PersistenceUnitInfo [
name: TestDS
...]
// ...
Loading Flyway Data
8 [main] INFO org.flywaydb.core.internal.util.VersionPrinter - Flyway Community Edition 5.0.7 by Boxfuse
246 [main] INFO org.flywaydb.core.internal.database.DatabaseFactory - Database: jdbc:h2:mem:test (H2 1.4)
354 [main] INFO org.flywaydb.core.internal.command.DbValidate - Successfully validated 2 migrations (execution time 00:00.028s)
377 [main] INFO org.flywaydb.core.internal.schemahistory.JdbcTableSchemaHistory - Creating Schema History table: "PUBLIC"."flyway_schema_history"
413 [main] INFO org.flywaydb.core.internal.command.DbMigrate - Current version of schema "PUBLIC": << Empty Schema >>
415 [main] INFO org.flywaydb.core.internal.command.DbMigrate - Migrating schema "PUBLIC" to version 1 - CreateDatabase
436 [main] INFO org.flywaydb.core.internal.command.DbMigrate - Migrating schema "PUBLIC" to version 2 - AddTestClasses
449 [main] INFO org.flywaydb.core.internal.command.DbMigrate - Successfully applied 2 migrations to schema "PUBLIC" (execution time 00:00.078s)
Apr 15, 2020 9:40:44 AM com.sun.enterprise.web.WebApplication start
INFO: Loading application [test] at [/test]
Apr 15, 2020 9:40:45 AM org.glassfish.deployment.admin.DeployCommand execute
INFO: test was successfully deployed in 7,649 milliseconds.
Apr 15, 2020 9:40:45 AM org.hibernate.hql.internal.QueryTranslatorFactoryInitiator initiateService
INFO: HHH000397: Using ASTQueryTranslatorFactory
Hibernate:
select
count(testobject0_.id) as col_0_0_
from
DB.TEST testobject0_
where
1=1
Apr 15, 2020 9:40:45 AM org.hibernate.engine.jdbc.spi.SqlExceptionHelper logExceptions
WARN: SQL Error: 30000, SQLState: 42Y07
Apr 15, 2020 9:40:45 AM org.hibernate.engine.jdbc.spi.SqlExceptionHelper logExceptions
ERROR: Schema 'DB' does not exist
// stack trace
/ ...