我正在使用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语句预加载测试数据,更新&#34;生成器表&#34;,但是我没有看到任何查询&#34;生成器表&#34;获取一批主键。然后 - 毫不奇怪 - 添加实体的尝试最终会导致约束违规。
问题:如何确保Hibernate在测试发生之前保留从脚本预加载的数据?
注1:我在EclipseLink / Glassfish4中遇到了这个问题,但是通过创建模式和从脚本加载数据(以前模式是从实体类生成)来解决这个问题。
注2:在没有预加载任何数据的情况下,测试在Glassgish4和WildFly10上都运行良好。
答案 0 :(得分:0)
好的,一个稍微不太理想的解决方案是将这个特定于实现的选项添加到持久性单元配置中:
<property name="hibernate.id.new_generator_mappings" value="false"/>
我发布了另一个可能更准确地解决问题的问题: JPA 2.1 testing: persisting the pre-loaded data