Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/symfony/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Arquillian和Flyway在内存中使用不同版本的H2_Java_H2_Flyway_Jboss Arquillian_Hibernate Entitymanager - Fatal编程技术网

Java Arquillian和Flyway在内存中使用不同版本的H2

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中创建)不

我正在尝试创建一个JPA助手,它最终将变成一个jar并用于其他项目。我想将集成测试添加到此项目中,因此我添加了一个
TestEntity
TestService
类(它们指的是
DB
模式中的一个简单的
TEST
表)

目标是使用创建内存中数据库,使用在容器中运行测试,以及使用创建/填充测试数据库。Flyway由
@ApplicationScoped
类的侦听器触发

但是,每当我触发集成测试时,测试似乎都能正常工作,直到调用
count(*)
查询为止。此时,Hibernate抱怨模式(刚刚在Flyway中创建)不存在:
schema'DB'不存在

有很多日志,但亮点如下所示:

  • 已启动测试Glassfish服务器
  • 冬眠开始
    • 它还没有抱怨什么
    • 如果
      hibernate.hbm2ddl.auto
      设置为
      validate
      ,则它会抱怨在Flyway中创建的表不存在(
      Schema validation:缺少表[DB.TEST]
  • Flyway执行数据迁移
    • 它表示两个脚本都成功执行
  • 测试代码开始运行
  • 代码失败了
    • 架构“DB”不存在
我认为我需要做什么 我认为Flyway和EntityManager正在与数据库的不同实例进行对话。Flyway所做的更改不会以EntityManager可以看到的方式保存

  • 确保
    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”不存在的问题
  • 各种风格的
    hibernate.hbm2ddl.auto
    • none
      架构“DB”不存在
    • 验证
      架构验证:缺少表[DB.TEST]
    • update
      create drop
      :已创建表格,但缺少来自Flyway的数据
  • 将Flyway代码放在EntityManagerFactory.create()中
  • 将Flyway代码放入and中
  • 更改Flyway/persistence.xml连接以使用数据库文件而不是内存(例如:
    jdbc:h2:~/testdb
    )。
    • 这将在
      C:\Users\
      中创建一个名为
      test db.mv
      的文件。该文件显示了Flyway与其交互的证据,但EntityManager仍生成
      模式“DB”不存在的错误
    • 我还将
      hibernate.hbm2ddl.auto
      设置为
      create
      ,然后在整个硬盘上搜索
      test db.mv
      的第二个实例,但没有找到
什么不起作用
    • 看起来很棒,但我在一个公司网络上,他们还没有批准
  • 弹簧-*
    • 这个项目没有使用Spring任何东西
日志和代码 执行日志 FlywaySQL脚本 这被分成两个文件(一个用于创建模式/表,另一个用于插入实际数据)。这些文件位于
/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
/ ...