【问题标题】:WildFly10/Hibernate: pre-loaded test data not persistedWildFly10/Hibernate:预加载的测试数据未持久化
【发布时间】:2018-04-18 14:07:46
【问题描述】:

我正在使用 Arquillian 针对 WildFly10 / H2 数据库测试(或尝试)我的 JPA/EJB 类。实体类的主键使用GenerationType.TABLE/META-INF/persistence.xml中的持久化单元:

<persistence-unit name="test">
        <provider>org.hibernate.ejb.HibernatePersistence</provider>
        <jta-data-source>java:/H2DS</jta-data-source>
        <properties>
            <property name="hibernate.dialect" value="org.hibernate.dialect.HSQLDialect" />

            <property name="javax.persistence.schema-generation.database.action" value="drop-and-create" />
            <property name="javax.persistence.schema-generation.create-source" value="script" />

            <property name="javax.persistence.schema-generation.create-script-source" value="META-INF/sql/create.sql" />
            <property name="javax.persistence.sql-load-script-source" value="META-INF/sql/load_script.sql" />

            <property name="javax.persistence.schema-generation.drop-source" value="script" />
            <property name="javax.persistence.schema-generation.drop-script-source" value="META-INF/sql/drop.sql" />
        </properties>

    </persistence-unit>

问题是,应该从 load_script.sql 预加载的数据在测试开始时没有提交。我可以从日志中看到用于预加载测试数据、更新“生成器表”的 SQL 语句,但我没有看到对“生成器表”的任何查询以获取一批主键。然后 - 毫不奇怪 - 添加实体的尝试最终会违反约束。

问题:如何使用 Hibernate 确保从脚本预加载的数据在测试发生之前被持久化?

注意 1: 我在使用 EclipseLink/Glassfish4 时遇到了这个问题,但通过创建架构和从脚本加载数据(以前架构是从实体类生成的)都解决了这个问题。

注意 2: 无需预加载任何数据,测试在 Glassgish4 和 WildFly10 上都能正常运行。

【问题讨论】:

  • 您能与我们分享您的 ShrinkWrap 定义吗?可能你没有打包 sql 文件。
  • @lordofthejars:不,当然不是这样。我可以在日志中看到脚本中的插入内容。问题是如何告诉 JPA 提供者:1)将数据刷新到生成器表 2)然后分配一组新的 ID 并更新表 3)然后持久化测试中的实体。目前,它尝试在同一个事务中执行所有 3 个步骤,但忽略了一些预先分配的 ID 已用于脚本中的实体这一事实。

标签: hibernate jpa java-ee-7 jboss-arquillian wildfly-10


【解决方案1】:

好的,一个不太理想的解决方案是将此特定于实现的选项添加到持久性单元配置中:

<property name="hibernate.id.new_generator_mappings" value="false"/>

我发布了另一个可能更准确地解决问题的问题: JPA 2.1 testing: persisting the pre-loaded data

【讨论】:

  • 参见docs.jboss.org/hibernate/orm/5.2/userguide/html_single/… 上的javax.persistence.hibernate.hbm2ddl.import_files 。它有一个注释“这些语句仅在创建模式时执行,这意味着 hibernate.hbm2ddl.auto 设置为创建、创建删除或更新。”
  • @JamesR.Perkins:是的,谢谢,我知道这一点。呃......这与问题有什么关系?
  • 我很抱歉。我错过了正在设置的 javax.persistence.schema-generation.database.action 属性。
猜你喜欢
  • 1970-01-01
  • 2010-12-01
  • 1970-01-01
  • 2010-09-28
  • 2013-03-13
  • 1970-01-01
  • 1970-01-01
  • 2019-11-22
  • 1970-01-01
相关资源
最近更新 更多