我正在使用Arquillian对“远程”容器(Glassfish 4和WildFly 10,具体而言)测试我的JPA类。我想:
有javax.persistence。*属性似乎符合要求,因此可以假设,以下内容将起作用:
<persistence-unit name="test">
<provider>org.hibernate.ejb.HibernatePersistence</provider>
<jta-data-source>java:/H2DS</jta-data-source>
<properties>
<property name="javax.persistence.schema-generation.database.action" value="drop-and-create"/>
<property name="javax.persistence.schema-generation.create-source" value="metadata"/>
<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>
嗯,不太好。
如果使用GenerationType.TABLE,则必须更新主键序列的值以及使用SQL脚本插入新实体。问题是虽然使用脚本插入了一些实体(当然也更新了“generator-table”中的主键值),但JPA提供程序不会以任何方式更新其预分配的ID。所以,我可以从日志中判断出来的是:
到目前为止找到的解决方案
EclipseLink :如果数据库架构和数据预加载都是通过脚本完成的,则可以正常工作。对于开发阶段来说是次优的,因为人们不得不经常使用SQL脚本。
Hibernate :如果设置了以下特定于实现的选项,则有效:
<property name="hibernate.id.new_generator_mappings" value="false"/>
允许实体持久测试,主键是分配大小的3倍(15,有3个实体)。
现在,问题是:是否存在一些“标准JPA”,与实现无关的方式来实现我在本问题开头列出的要求?它们看起来并不奢侈,所以应该有现成的解决方案,对吧?