【发布时间】: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